2011-11-19 63 views
0

Moq存儲庫設置FindBy方法Im新moq並一直在努力滿足以下要求。使用Func <>

我曾嘲笑稱爲_mockedThingsList

列表清單,我想我的起訂量的IRepository的FindBy從基於我的服務,正在測試中提供的LINQ查詢嘲笑這個列表中返回。

我現在有什麼引發異常,如下所示。請問有什麼不對?

mock.Setup(moq => moq.FindBy(It.IsAny<Func<IThing, bool>>())) 
      .Returns((enumThingType tp) => _mockedThingsList.Where(x => x.ThingType == tp)); 

的倉庫界面看起來像:

interface IRepository<T> 
{ 
    IEnumerable<T> FindAll(); 

    IEnumerable<T> FindBy(Func<T, bool> predicate); 
    void Add(T item); 
    void Remove(T item); 

    bool Contains(T item); 
    int Count { get; } 
} 

這將這個模擬

class ThingService 
{ 
    private readonly IRepository<IThing> _repository; 

    public ThingService(IRepository<IThing> repository) 
    { 
     _repository = repository; 
    } 


    public List<IThing> GetThings1() 
    { 
     return _repository.FindBy(y => y.ThingType == enumThingType.WhatEver).ToList(); 
    } 

    public List<IThing> GetThings2() 
    { 
     return _repository.FindBy(y => y.Name == "What ever").ToList(); 
    } 
} 
+0

你在掙扎,因爲你正在測試值而不是契約。如果你想測試值,使用假。 –

+0

對不起,我新來的Moq和林不知道你的意思。你能否詳細說明一下? mayeb舉一個快速的例子? – John

+0

您能否提供您正在收到的異常消息/詳細信息? –

回答

5

我可能會丟失一些背景,但在我看來,你是在嘲諷。嘲笑列表的目的是什麼?您可以輕鬆地返回一個具體列表並將其用於您的測試。

+0

我得到了相同的氛圍。我的假設是他過於嘲笑,因爲他試圖在集成層面進行測試,同時仍然通過「單元」的鏡頭查看他的測試。 –

+0

我不覺得這是TDD。 –

+0

好吧,根據你的意見和其他反饋,我已決定走假道路。我創建了一個包含mocks列表的存儲庫的具體實現。這給了我所需的功能。這種方法是更TDD還是我再次通過在我的列表中使用模擬它太遠? – John

0

我可能是錯在我的解釋,但FindBy的簽名是被測試的服務返回一個IEnumerable。雖然存根,但您要返回一個委託。我想由於這種返回類型的不匹配,你正面臨着這個問題。出於測試目的,你爲什麼不只是從返回方法返回一些適當的名單即

(moq => moq.FindBy(It.IsAny<Func<IThing, bool>>())) 
      .Returns(// return a proper List of type T); 

類型「System.ArgumentException」的未處理的異常出現在mscorlib.dll的 其他信息: 類型的對象'System.Func`2 [ThingNamespace.IThing,System.Boolean]' 不能是 轉換爲類型 'ThingNamespace.enumThingType'

這裏是東西。當您在FindBy上聲明存根時,您將指定類型參數爲:Func。現在在你的Returns方法中,輸入參數應該是完全相同的類型。試試下面的代碼:

Func<IThing, bool> func => (IThing thing) => thing.ThingType == tp; 

(moq => moq.FindBy(It.IsAny<Func<IThing, bool>>())) 
      .Returns((func) => _mockedThingsList.Where(func)); 
+0

.Returns(new [] {thingA,thingB}; –

+0

你是部分權利,下面的工作,但不是我之後 'code'mockRep.Setup(moq => moq.FindBy(It.IsAny >())) 。返回(新列表(){_mockedThingsList [0],_mockedThingsList [1]}); 我是想查詢與LINQ查詢_mockedlist在我的服務 – John

+0

我的服務包含以下代碼 公開名單 GetThings1(){ 回報 _repository.FindBy(Y => y.ThingType == enumThingType.WhatEver ).ToList(); } 這將是對moq存儲庫調用的linq,因此從我的_mockThingsList中讀取 – John

相關問題