如何在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); 
+0

是什么'PropertyBehavior()'做什么呢? – MalcomTucker 2011-06-04 12:00:44

+0

它告诉Rhino.Mocks模拟属性的简单属性行为,即您可以像“普通”对象的任何其他属性一样获取和设置属性值。 – Chaquotay 2011-06-04 13:04:23

首先,有行为上的差异之间在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); 
    } 
+0

谢谢,你介意解释犀牛模拟和存根之间的区别是什么? – MalcomTucker 2011-06-04 16:02:30

+0

存根仅用于模拟您正在测试的代码外部的代码,以便您可以运行测试场景。嘲笑不仅仅是为了模拟外部代码,还是为了设定期望并验证这些期望。 Rhino.Mocks笔者实际公布前一阵子,这两种类型将被合并到在lib新版本的一个单独的实体,但我没有看到任何发生在这一方面。 – 2011-06-04 17:52:34