2011-06-04 69 views
0

我在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」,並且該方法永遠不會改變它的值 - 這裏發生了什麼?

回答

11

你試過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

3

首先,有行爲上的差異之間在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