2016-03-07 31 views
5

我們正在使用Autofac.Extras.Moq.AutoMock。 現在我有使用懶惰<>如何使用Lazy <>與AutoMock(Moq)

public MyService(Lazy<IDependency> myLazyDependency) {...} 

測試MyService我們需要模擬Lazy<Dependency>構造函數依賴。

我想這跟

[ClassInitialize] 
public static void Init(TestContext context) 
{ 
    autoMock = AutoMock.GetLoose(); 
} 

[TestInitialize] 
public void MyTestInitialize() 
{ 
    var myDepMock = autoMock.Mock<Lazy<IDependency>>(); // <-- throws exception 
} 

這是測試運行器返回的異常:

初始化方法Tests.MyServiceTests.MyTestInitialize拋出異常。 System.InvalidCastException:System.InvalidCastException:無法轉換類型的對象 'System.Lazy 1[IDependency]' to type 'Moq.IMocked 1 [System.Lazy`1 [IDependency]]' ..

所以,如何可以我通過使用懶惰<>嘲笑對象automock。

+0

爲什麼不模仿'IDependency',然後傳遞'new Lazy(mockedObj)'(或者它的內建 - 我忘了)?沒有理由模仿'懶惰',你沒有測試系統框架。 – Rob

+0

好主意,但我不能得到它的工作。你需要傳遞一個lambda。 MockedObj不被接受。 – dampee

+0

然後傳遞類似'new Lazy(()=> mockedObj)':) – Rob

回答

6

您不需要模擬Lazy,因爲它是框架的一部分(禁止一些極端情況)。你可以簡單地模擬IDependency並將模擬對象傳遞給Lazy

像這樣的東西應該工作:

var mockDependency = autoMock.Mock<IDependency>(); 
var mockObject = mockDependency.Object; //(Not entirely sure of the property for this library) 
var mockedLazy = new Lazy<IDependency>(() => mockObject); 

需要注意的是,這將意味着Lazy基本上不會做任何事情對你的測試(如果這是一個問題) - 它會簡單地返回已創建的模擬,當它第一次使用

+1

對於那些感興趣的人,我從automock傢伙那裏得到了類似的迴應:https://github.com/autofac/Autofac.Extras.Moq/issues/3 – dampee

相關問題