如何在C#和Rhinomocks中设置模拟属性?
我在Rhinomocks中设置属性值时遇到问题。我需要在被测方法外设置属性的初始值,然后有条件地在被测方法内设置它的值。有些代码:如何在C#和Rhinomocks中设置模拟属性?
public interface IResponse
{
string ResponseText { get; set; }
}
public void ProcessResponse(IResponse response)
{
if(response.ResponseText == "Unset")
{
response.ResponseText = someService.GetResponse();//someService here is irrelvant to the question
}
}
[TestMethod]
public void ResponseValueIsSetWhenConditionIsTrueTest()
{
var mock = Mock<IResponse>.GenerateMock();
mock.Stub(x => x.ResponseText).Returns("Unset");
Processor.ProcessResponse(mock);
Assert.AreEqual("Responseval", mock.ResponseText); //Fails because the method doesn't set the value of the property.
}
我需要模拟的属性有一个初始值进入测试的法案的一部分,并允许被测方法更改该值,所以我可以在它以后断言。但是mock.ResponseText
总是被设置为“Unset”,并且该方法永远不会改变它的值 - 这里发生了什么?
你试过PropertyBehavior
?例如:
mock.Stub(x => x.ResponseText).PropertyBehavior();
然后在您的测试:
mock.ResponseText = "Unset";
Processor.ProcessResponse(mock);
Assert.AreEqual("Responseval", mock.ResponseText);
首先,有行为上的差异之间在Rhino.Mocks嘲笑和存根。其次,我不知道你使用的是什么版本Rhino.Mocks的,但使用的是最新一个和AAA语法,这无疑作品:
public interface IResponse
{
string ResponseText { get; set; }
}
...
[Test]
public void Test()
{
IResponse response = MockRepository.GenerateStub<IResponse>();
response.ResponseText = "value1";
Assert.AreEqual("value1", response.ResponseText);
response.ResponseText = "value2";
Assert.AreEqual("value2", response.ResponseText);
}
谢谢,你介意解释犀牛模拟和存根之间的区别是什么? – MalcomTucker 2011-06-04 16:02:30
存根仅用于模拟您正在测试的代码外部的代码,以便您可以运行测试场景。嘲笑不仅仅是为了模拟外部代码,还是为了设定期望并验证这些期望。 Rhino.Mocks笔者实际公布前一阵子,这两种类型将被合并到在lib新版本的一个单独的实体,但我没有看到任何发生在这一方面。 – 2011-06-04 17:52:34
是什么'PropertyBehavior()'做什么呢? – MalcomTucker 2011-06-04 12:00:44
它告诉Rhino.Mocks模拟属性的简单属性行为,即您可以像“普通”对象的任何其他属性一样获取和设置属性值。 – Chaquotay 2011-06-04 13:04:23