2010-04-07 99 views
4

我試圖用犀牛嘲笑嘲笑以下拉姆達,但不斷撞擊磚牆在犀牛嘲弄嘲弄拉姆達

var result = rep.Find<T>(x => (x as IEntity).ID == (entity as IEntity).ID).FirstOrDefault(); 

任何想法?

+0

你究竟在嘗試測試什麼? – Grzenio 2010-04-07 15:45:30

回答

5

答案我是後

repository.Expect(action => action.Find<Entity>(x => x.ID == 0)) 
      .IgnoreArguments() 
      .Return(entities) 
      .Repeat 
      .Any(); 
+3

這與我所得出的結論是一樣的,但不幸的是,它仍然留下了我的單元測試能力(以及我所假設的)的一個漏洞。 如果我有一個測試需要使用不同的參數對repository.Find方法進行多次調用,那麼我該如何爲此設置一個模擬?我需要模擬表達式>,並且在設置模擬時爲表達式創建的引用不會等同於稍後在代碼中創建的表達式,因爲它將是對其他等效表達式的新引用。 – Mark 2010-06-17 20:16:21

+0

有沒有人知道馬克說的問題的一個很好的解決方案? – Jonna 2011-06-02 22:52:33

+0

看看這個[鏈接](http://blog.spinthemoose.com/2011/07/28/using-rhino-mocks-whencalled-remember-to-return/)。 mockRepo.Expect(r => r.Get (Arg >>。Is.Anything))。WhenCalled(invocation => ...'允許您捕獲所有調用,然後返回一個值這取決於輸入的lambda表達式 – 2014-08-13 01:09:51

5

在單元測試中,您有被測系統(SUT)及其合作者。嘲笑的目標是用你完全控制的東西取代合作者。這樣你就可以設置不同的測試用例,並且你可以專注於測試被測系統的行爲,而不是別的。

在這種情況下,我假設rep對象是SUT。您傳遞給SUT的Find方法的lambda可以被認爲是合作者。既然你已經完全控制了這個lambda,那麼試圖用Rhino Mocks來模擬它並沒有什麼意義。

我會嘗試給出一個涉及Rhino Mocks和lambdas的單元測試的例子;-)這是一個示例測試,它創建一個始終返回false的謂詞存根,並驗證Find方法實際調用謂詞:

[Test] 
public void Find_returns_nothing_if_predicate_always_false() 
{ 
    var predicateStub = MockRepository.GenerateStub<Func<Entity,bool>>(); 
    predicateStub.Stub(x => x(Arg<Entity>.Is.Anything)).Return(false); 

    var repository = new Repository(); 
    var entities = repository.Find(predicateStub); 

    Assert.AreEqual(0, entities.Count(), 
     "oops, got results while predicate always returns false"); 
    predicateStub.AssertWasCalled(x => x(Arg<Entity>.Is.Anything)); 
} 

當然,就像在你自己的例子中,你並不需要Rhino Mocks。拉姆達語法的意義就在於可以很容易地提供就地實現:找到

[Test] 
public void Find_returns_nothing_if_predicate_always_false() 
{ 
    bool predicateCalled = false; 
    Func<Entity,bool> predicate = x => { predicateCalled = true; return false; }; 

    var repository = new Repository(); 
    var entities = repository.Find(predicate); 

    Assert.AreEqual(0, entities.Count(), 
     "oops, got results while predicate always returns false"); 
    Assert.IsTrue(predicateCalled, "oops, predicate was never used"); 
} 
+0

+1我從來沒有見過需要嘲笑的lambda。 – Jay 2010-04-08 02:15:16

+0

是的你是正確的,但我所要做的就是模擬目前的代碼行,因爲我沒有測試該行。 – Coppermill 2010-04-08 10:45:08

0

這樣,我們才能不出來..因爲由於IgnoreArguments(),它永遠不會進入並看到參數的值,我們將通過。 但是這種方法的主要問題是編寫AssertWasCalled(某些lambda表達式)是不可能的,因爲現在在Assert部分它顯示像ExpectaionViolationException那樣的錯誤是用戶代碼未處理的

+0

這似乎不是要回答這個問題的嘗試,你是不是要問這是一個單獨的問題? – 2013-06-20 11:29:22

+0

這是支持我給我的觀點,上面的方法忽略了參數是不正確的,因爲在上面我們迫使測試用例通過。 – Passenger 2013-06-21 07:38:12