如何在C#和Rhinomocks中设置模拟的属性?
我在Rhinomock中设置属性的值时遇到问题。我需要在被测试的方法外部设置属性的初始值,然后在被测试的方法内部有条件地设置它的值。一些代码:如何在C#和Rhinomocks中设置模拟的属性?,c#,unit-testing,rhino-mocks,C#,Unit Testing,Rhino Mocks,我在Rhinomock中设置属性的值时遇到问题。我需要在被测试的方法外部设置属性的初始值,然后在被测试的方法内部有条件地设置它的值。一些代码: public interface IResponse { string ResponseText { get; set; } } public void ProcessResponse(IResponse response) { if(response.ResponseText == "Unset") { res
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.
}
公共接口i响应
{
字符串响应文本{get;set;}
}
public void ProcessResponse(i响应响应)
{
如果(response.ResponseText==“Unset”)
{
response.ResponseText=someService.GetResponse();//此处的someService与问题无关
}
}
[测试方法]
public void responseValueIsTwehenConditionIstrueTest()
{
var mock=mock.GenerateMock();
mock.Stub(x=>x.ResponseText).Returns(“Unset”);
Processor.ProcessResponse(模拟);
Assert.AreEqual(“Responseval”,mock.ResponseText);//失败,因为该方法未设置属性的值。
}
我需要mock的属性在测试的Act部分中有一个初始值,并允许测试中的方法更改该值,以便稍后对其进行断言。但是,
mock.ResponseText
始终设置为“Unset”,并且该方法从不更改其值-这里发生了什么 您是否尝试过PropertyBehavior
?例如:
mock.Stub(x => x.ResponseText).PropertyBehavior();
然后在你的测试中:
mock.ResponseText = "Unset";
Processor.ProcessResponse(mock);
Assert.AreEqual("Responseval", mock.ResponseText);
首先,Rhino.mock中的mock和stubs在行为上存在差异。其次,我不确定您使用的是什么版本的Rhino.mock,但使用最新版本和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);
}
公共接口i响应
{
字符串响应文本{get;set;}
}
...
[测试]
公开无效测试()
{
IResponse-response=MockRepository.generateSub();
response.ResponseText=“value1”;
Assert.AreEqual(“value1”,response.ResponseText);
response.ResponseText=“value2”;
Assert.AreEqual(“value2”,response.ResponseText);
}
PropertyBehavior()具体做什么?它告诉Rhino.Mocks模拟属性的简单属性行为,即您可以像“普通”对象的任何其他属性一样获取和设置属性值。谢谢,您能解释一下Rhino中的模拟和存根之间的区别吗?存根只用于模拟您正在测试的代码外部的代码,以便您可以运行您的测试场景。mock不仅用于模拟外部代码,还用于设置对其的期望并验证这些期望。Mocks的作者实际上在不久前宣布,这两种类型将在新版本的lib中合并为一个实体,但我没有看到在这方面发生任何事情。