2016-04-16 4 views
2

で新しいオブジェクトを生成しない:部品番号 - あざける工場は、私は次のメソッドをMOQし、テストしようとしている各反復

public List<SkuCountByRetailerVm> GetSkuCountsByRetailer() 
{ 
    var viewModels = _factory.GetEmptyListOfSkuCountByRetailerVms(); 
    foreach (var retailer in _helper.GetAllRetailersInReading()) 
    { 
     var vm = _factory.GetSkuCountsByRetailerVm(); 
     vm.Retailer = retailer; 
     vm.SkuCount = _helper.GetSkuCountByRetailerInReading(retailer); 
     viewModels.Add(vm); 
    } 
    return viewModels; 
} 

SkuCountByRetailerVmクラスは非常に基本的なデータ転送オブジェクトである、それは小売業者とSkuCountの性質を持っています。

テスト対象のクラスは、IFactoryとIHelperに依存します。どちらも私がテストクラスで嘲笑しています。

テスト対象のクラスのコードが正常であるようです。嘲笑するときの問題は、3つの異なるビューモデルではなく、3つの同じビューモデルをリストに追加することです(最後に追加すると思われるビューモデルと同じです)。私のテストの問題は、私が工場のモークをセットアップする方法であると思います。mockFactory.Setup(m => m.GetSkuCountsByRetailerVm()).Returns(new SkuCountByRetailerVm()); VMは同じオブジェクトを指しているだけなので、毎回新しいVMをインスタンス化する必要がありますか?これが正しい結論であるかどうかわからない場合は、どうすればそれをMoqとは別の方法で行うのか。

これが必要な場合は、以下のテストクラスを貼り付けます。


[TestInitialize] 
public void Setup() 
{ 
    Mock<IReadingHelper> mockHelper = new Mock<IReadingHelper>(); 
    Mock<IVmFactory> mockFactory = new Mock<IVmFactory>(); 
    mockFactory.Setup(m => m.GetEmptyListOfSkuCountByRetailerVms()).Returns(new List<SkuCountByRetailerVm>()); 

    mockFactory.Setup(m => m.GetSkuCountsByRetailerVm()).Returns(new SkuCountByRetailerVm()); 

    mockHelper.Setup(m => m.GetAllRetailersInReading()).Returns(
       new List<string> { "Fake1", "Fake2", "Fake3" }); 
    mockHelper.Setup(m => m.GetSkuCountByRetailerInReading("Fake1")).Returns(5); 
    mockHelper.Setup(m => m.GetSkuCountByRetailerInReading("Fake2")).Returns(10); 
    mockHelper.Setup(m => m.GetSkuCountByRetailerInReading("Fake3")).Returns(15); 

    SkuCountByRetailerVmBuilder builder = new SkuCountByRetailerVmBuilder(mockHelper.Object, mockFactory.Object); 

    _vms = builder.GetSkuCountsByRetailer(); 
} 

答えて

4

Returns methodは、過負荷の多くを持っています。現在、あなたが返すように値を指定することができ、部品番号が同じ値にモックメソッドが呼び出されるたびに使用して署名Returns(TResult)とのいずれかを使用している

(つまり、あなたのSkuCountByRetailerVmの同じインスタンスを取得します。

あなたが別のインスタンスあなたの嘲笑するたびに取得します。この設定では

mockFactory.Setup(m => m.GetSkuCountsByRetailerVm()) 
      .Returns(() => new SkuCountByRetailerVm()); 

:あなたはメソッドから返される値を計算する関数を指定することができ、これにFunc<TResult> as a parameterを取るオーバーロードのいずれかを使用する必要がありますメソッドが呼び出されます。

+0

ありがとう、これは完全に動作します。 – Turo

関連する問題