2011-11-03 40 views
0

場景: 驗證我的課程使用提供的IRestclient發出RestRequest,其中在請求中設置了某些參數。使用Rhino Mocks聲明吊牀RestRequest參數

public class MyClass { 
    private readonly IRestClient _client; 

    public MyClass(IRestClient client) { 
     _client = client; 
    } 

    void DoIt() { 
     var req = new RestRequest { Method = WebMethod.Get, Path = "/DoIt" }; 
     req.AddParameter("key1", "value1"); 
     req.AddParameter("key2", "value2"); 

     var resp = _client.Request(req); 
    } 

} 

[TestFixture] 
public class MyClassTests { 
    [Test] 
    public void VerifyDoIt() { 
     var client = MockRepository.GenerateStrictMock<IRestClient>(); 
     var resp = new RestResponse { StatusCode = HttpStatusCode.OK }; 
     client.Expect(x => x.Request(null)).IgnoreArguments().WhenCalled(inv => { 
      var req = inv.Arguments[0] as RestRequest; 
      //NO WAY TO VALIDATE THAT PARAMETERS HAS BEEN SET! 
      inv.ReturnValue = resp; 
     }); 
    } 
} 

是吊牀根本就沒有以這種方式檢驗的還是我失去了一些東西重要?

編輯:這不是一個關於如何使用Rhino.Mocks訪問/驗證方法參數的問題,而是Hammock如何/如果支持在單元測試場景中設置測試/驗證請求參數。

+0

那麼你想檢查在DoIt()方法中創建的「req」變量的值嗎? – PatrickSteele

+0

對不起,我現在意識到我的問題有點不清楚我想要什麼解決方案。這更像是一個Hammock問題,而不是一個Rhino.Mocks問題。例如。吊牀不支持這個,或者Hammock中有一些隱藏功能可以讓用戶訪問和驗證這些東西。 –

回答

0

如果您需要驗證發送到模擬/存根方法的參數,可以使用Rhino.Mocks的「GetArgumentsForCallsMadeOn」方法。將它傳遞給代表所做調用的lambda表達式,它將返回一個鋸齒形數組。第一個元素([0])將是第一次調用該方法時傳遞的參數數組。 ([1])將是參數數組第二元件通過所述第二時間的方法被調用,等等...

你可以重新編寫測試這樣來驗證請求數據:

var client = MockRepository.GenerateStub<IRestClient>(); 

var mc = new MyClass(client); 
mc.DoIt(); 

client.AssertWasCalled(c => c.Request(null), o => o.IgnoreArguments()); 
var req = (RestRequest)client.GetArgumentsForCallsMadeOn(c => c.Request(null), o => o.IgnoreArguments())[0][0]; 

Assert.AreEqual("/DoIt", req.Path); 
Assert.AreEqual(WebMethod.Get, req.Method);