Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在C#和Rhinomocks中设置模拟的属性?_C#_Unit Testing_Rhino Mocks - Fatal编程技术网

如何在C#和Rhinomocks中设置模拟的属性?

如何在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

我在Rhinomock中设置属性的值时遇到问题。我需要在被测试的方法外部设置属性的初始值,然后在被测试的方法内部有条件地设置它的值。一些代码:

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中合并为一个实体,但我没有看到在这方面发生任何事情。