2014-04-18 62 views
11

嘲諷一個具體的類時,調用與接口參數的構造函數我有以下的類,它使用構造器注入:如何使用起訂量

public class Service : IService 
{ 
    public Service(IRepository repository, IProvider provider) { ... } 
} 

對於這個類的大多數方法,我簡單地創建起訂量嘲笑爲IRepositoryIProvider並構建Service。但是,類中有一個方法可以在同一個類中調用其他幾個方法。爲了測試這種方法,我不想一起測試所有這些方法,而是想測試該方法是否正確調用這些方法並正確處理其返回值。

最好的辦法是模擬Service。我之前用Moq嘲笑過具體的課,沒有問題。我甚至嘲笑了具有Moq構造參數的具體類沒有問題。不過,這是我第一次需要將嘲諷參數傳遞給模擬對象的構造函數。當然,我試圖這樣做:

var repository = new Mock<IRepository>(); 
var provider = new Mock<IProvider>(); 

var service = new Mock<Service>(repository.Object, provider.Object); 

但是,這是行不通的。相反,我得到以下錯誤:

Castle.DynamicProxy.InvalidProxyConstructorArgumentsException : Can not instantiate proxy of class: My.Namespace.Service. 
Could not find a constructor that would match given arguments: 
    Castle.Proxies.IRepository 
    Castle.Proxies.IProvider 

此工作正常,如果Service的構造函數只接受簡單的參數,像int S和string S,但如果需要我不能說我嘲笑接口。你怎麼做到這一點?

+1

您使用哪個Moq和城堡版本?因爲你的示例代碼工作正常使用Moq 4.2.1312.1622和Castle.Core 3.2.2 ... – nemesv

回答

4

我有一個非常類似的問題,當我的Service的等價物有一個內部構造函數,所以它不可見Moq。

我加

[assembly: InternalsVisibleTo("DynamicProxyGenAssembly2")] 

我的AssemblyInfo.cs爲實施項目文件。不確定它是否相關,但我想增加一個建議,以避免它可以幫助你或其他人。

1

它必須是舊版本的問題,一切正常,與最新版本。尼克,請檢查! P:我從誤會開始賞金(我在我的構造函數中籤名錯誤)。

3

你爲什麼嘲笑你正在測試的服務?如果您希望測試Service類的實現(不管是否是對模擬對象的調用),您只需要模擬兩個接口,而不是測試類。

相反的:

var repository = new Mock<IRepository>(); 
var provider = new Mock<IProvider>(); 

var service = new Mock<Service>(repository.Object, provider.Object); 

它不應該是這樣呢?

var repository = new Mock<IRepository>(); 
var provider = new Mock<IProvider>(); 

var service = new Service(repository.Object, provider.Object); 

我意識到這是可能在一些框架嘲笑具體的對象,但什麼是你的預期目的?嘲弄某些東西的想法是刪除實際的實現,以便它不影響你的測試。但在你的問題中,你已經表明你想知道某些類被正確調用,然後你想驗證這些行爲的結果。毫無疑問,這是對實施進行測試的結果,因此我很難看到嘲笑具體對象的目標。