2017-05-23 5 views
0

でAutofaqインターフェイスを模擬するために/ Autofac/MOQ:がどのようにC#を使用して部品番号

public class MyService 
{ 
    private readonly IlifetimeScope _scope; 

    public MyService(ILifetimeScope scope) 
    { 
     _scope = scope; 
    } 

    public void DoWork() 
    { 
     var dbContext = _scope.Resolve<IDataContext>(); 
    } 
} 

これは、実行時に動作します。私はこのクラスを持っています。しかし、私はResolve()メソッドをモックすることができないので、私はそれをユニットテストすることはできません。これは拡張メソッドです。

偽装するにはどうすればよいですか?明らかなことは、IDataContextをILifetimeScopeの代わりにコンストラクタに挿入することですが、いろいろな理由でIDataContextを挿入することはできません。

だから、代わりにFuncを注入するのですか?同様に

public class MyService 
{ 
    private readonly Func<IDataContext> _dbContext; 

    public MyService(Func<IDataContext> dbContext) 
    { 
     _dbContext = dbContext; 
    } 

    public void DoWork() 
    { 
     var ctxt = _dbContext(); 
     // do stuff 
    } 
} 

:私はそれを模擬することができますが、AutofacがCTORに正しいパラメータを注入する方法を見つけ出すだろうか?または、これを行うためのより簡単な方法がありますか?

+1

コンストラクタインジェクションを使用することができないさまざまな理由が、サービスロケータのアンチパターンを使用するようになったのは不思議です。それは可能性があると認識していますが、テストの回避策を探すのではなく、問題を解決するのはなぜですか(おそらくAutofacを参照する必要はないはずです)。 DIコンテナへの参照を削除すると何が起こるかを検討することは有益です。もしコンポジションルートの外側にあるものが壊れてしまったら、コンテナに密接に結合されている可能性があります。 – NightOwl888

+0

スコープをモックしないでください。モックの中身を入れてください。 –

答えて

0

あなたは単にスコープを嘲笑したと考えましたか?

public class Test 
{ 
    private readonly Mock<ILifetimeScope> _scopeMock; 
    private readonly Mock<IDataContext> _contextMock; 

    public Test() 
    { 
     _contextMock = new Mock<IDataContext>(); 
     _scopeMock = new Mock<ILifetimeScope>(); 
     _scopeMock.Setup(s => s.Resolve<IDataContext>()).Returns(_contextMock.Object); 
    } 
} 
+2

私の質問で述べたように、Resolve()メソッドは拡張メソッドなので、嘲笑されません。 –

0

これを見ている人は誰でも。 Func<T>トリックが私のために働いた。

関連する問題