2016-12-12 3 views
4

私は、IOptionsSnapshot<AbOptions>のasp.netコア内蔵DIインスタンス(動的構成)を取得するクラスAbClassを持っています。 今このクラスをテストしたいと思います。テストのためにIOptionsSnapshotインスタンスを模擬する方法

私はテストクラスでAbClassクラスをインスタンス化しようとしているが、私はAbClassのコンストラクターに注入するIOptionsSnapshot<AbOptions>のインスタンスをインスタンス化する方法は考えています。

私はMock<IOptionsSnapshot<AbOptions>>.Objectを試しましたが、AbClassではこの値(var x = _options.cc.D1)を使用しているため、このインスタンスにはいくつかの値を設定する必要があります。

ので、私は

var builder = new ConfigurationBuilder(); 
builder.AddInMemoryCollection(new Dictionary<string, string> 
{ 
    ["Ab:cc:D1"] = "https://", 
    ["Ab:cc:D2"] = "123145854170887" 
}); 
var config = builder.Build(); 
var options = new AbOptions(); 
config.GetSection("Ab").Bind(options); 

のようなコードを持っているが、私は、このオプションとIOptionsSnapshotのモックをリンクする方法を知りません。

AbClass:

public class AbClass { 
    private readonly AbOptions _options; 

    public AbClass(IOptionsSnapshot<AbOptions> options) { 
     _options = options.Value;  
    } 
    private void x(){var t = _options.cc.D1} 
} 

私のテストは、このクラスをインスタンス化:

var service = new AbClass(new Mock???) 

x()を呼び出すAbClassのメソッドをテストする必要がありますが、ときにそれが_options.cc.D1

+0

の適切な値を返す必要があり、それが使用されているかAbClassを表示します。また、テストしたいものに関して、望ましい動作を示します。 – Nkosi

+0

@Nkosiは今はっきりしていますか? – arielorvits

+2

良い質問です! 'IOptions 'には、 'Options'クラスに静的な' Create'メソッドがありますが、IOptionsSnapshot 'に対して私と同じようなジャンプはありません。答えが何か不思議です。 –

答えて

4

ArgumentNullExceptionを投げますあなたは、インターフェイスをモックアップし、tのオプションクラスのインスタンスを作成することができるはずですEST(東部基準時。私がオプションクラスのネストされたクラスを認識していないので、私は広範な仮定をしています。

Documentation: IOptionsSnapshot

//Arrange 
//Instantiate options and nested classes 
//making assumptions here about nested types 
var options = new AbOptions(){ 
    cc = new cc { 
     D1 = "https://", 
     D2 = "123145854170887" 
    } 
}; 
var mock = new Mock<IOptionsSnapshot<AbOptions>>(); 
mock.Setup(m => m.Value).Returns(options); 

var service = new AbClass(mock.Object); 

ネストされた値にアクセスするには、今の代わりにNRE

関連する問題