2016-03-07 4 views
5

私たちはAutofac.Extras.Moq.AutoMockを使用しています。 は、今、私たちはLazy<Dependency>を模擬する必要がMyServiceをテストするためにレイジー<>どのようにLazy <>をAutoMock(Moq)で使用できますか

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

を使用して、コンストラクタ依存性を持っています。

私は

[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

良いアイデアだが、うまく動作しない。あなたはラムダを渡す必要があります。 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

関連する問題