我試圖用犀牛嘲笑嘲笑以下拉姆達,但不斷撞擊磚牆在犀牛嘲弄嘲弄拉姆達
var result = rep.Find<T>(x => (x as IEntity).ID == (entity as IEntity).ID).FirstOrDefault();
任何想法?
我試圖用犀牛嘲笑嘲笑以下拉姆達,但不斷撞擊磚牆在犀牛嘲弄嘲弄拉姆達
var result = rep.Find<T>(x => (x as IEntity).ID == (entity as IEntity).ID).FirstOrDefault();
任何想法?
答案我是後
repository.Expect(action => action.Find<Entity>(x => x.ID == 0))
.IgnoreArguments()
.Return(entities)
.Repeat
.Any();
這與我所得出的結論是一樣的,但不幸的是,它仍然留下了我的單元測試能力(以及我所假設的)的一個漏洞。 如果我有一個測試需要使用不同的參數對repository.Find方法進行多次調用,那麼我該如何爲此設置一個模擬?我需要模擬表達式
有沒有人知道馬克說的問題的一個很好的解決方案? – Jonna 2011-06-02 22:52:33
看看這個[鏈接](http://blog.spinthemoose.com/2011/07/28/using-rhino-mocks-whencalled-remember-to-return/)。 mockRepo.Expect(r => r.Get
在單元測試中,您有被測系統(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");
}
+1我從來沒有見過需要嘲笑的lambda。 – Jay 2010-04-08 02:15:16
是的你是正確的,但我所要做的就是模擬目前的代碼行,因爲我沒有測試該行。 – Coppermill 2010-04-08 10:45:08
這樣,我們才能不出來..因爲由於IgnoreArguments(),它永遠不會進入並看到參數的值,我們將通過。 但是這種方法的主要問題是編寫AssertWasCalled(某些lambda表達式)是不可能的,因爲現在在Assert部分它顯示像ExpectaionViolationException那樣的錯誤是用戶代碼未處理的
這似乎不是要回答這個問題的嘗試,你是不是要問這是一個單獨的問題? – 2013-06-20 11:29:22
這是支持我給我的觀點,上面的方法忽略了參數是不正確的,因爲在上面我們迫使測試用例通過。 – Passenger 2013-06-21 07:38:12
你究竟在嘗試測試什麼? – Grzenio 2010-04-07 15:45:30