2017-09-14 5 views
1

Moqを使ってC#ユニットテストを書いていますが、Moqライブラリで非常に奇妙な動作と思われるものを見ています。Moq.VerifyがLinq.Selectの使用法で壊れているようです

私はLinq.Selectラインが有効とコメントアウト手巻き反復して以下のコードを実行した場合、私が取得:

はモックの呼び出しを正確に9回予想されるが、18倍となりました:E => e.ExampleMethod(It.IsAny()) 総テスト:1.合格:0は失敗しました:1.スキップ:0

私はLinq.Selectでテストを実行する場合はコメントアウトして手が反復圧延私が得る:

総テスト:1.合格:1.失敗:スキップされた:0

もし私がLinq.Selectステートメントを有効にして、さらにConsole.WriteLine呼び出しを貼り付けてコピーすると、検証された呼び出し回数は出力ごとに9ずつ増加します。それは本当に私にとって奇妙に思える。

[Test] 
    public void TestPossibleMoqBug() { 
     var exampleMock = new Mock<IExample>(); 
     exampleMock.Setup(e => e.ExampleMethod(It.IsAny<string>())) 
        .Callback<string>(m => { Console.WriteLine($"ExampleMethod called with '{m}'."); }); 
     var examples = new[] { "a", "b", "c" }; 
     var output = new Dictionary<string, IEnumerable<int>> {}; 
     foreach (var example in examples) { 
      // Results in 18 calls (with two Console.WriteLines below) 
      output[example] = examples.Select(exampleMock.Object.ExampleMethod); 

      // Results in 9 calls (with two Console.WriteLines below) 
      //var results = new List<int>(); 
      //foreach (var innerExample in examples) { 
      // results.Add(exampleMock.Object.ExampleMethod(innerExample)); 
      //} 
      //output[example] = results; 
     } 
     // For each line of output here it results in another 'verified' call when using Linq.Select 
     Console.WriteLine("Flat view: " + output.Values.SelectMany(x => x).Count()); 
     Console.WriteLine("Flat view: " + output.Values.SelectMany(x => x).Count()); 
     exampleMock.Verify(e => e.ExampleMethod(It.IsAny<string>()), Times.Exactly(examples.Length * examples.Length)); 
    } 

    public interface IExample { 
     int ExampleMethod(string message); 
    } 

答えて

2

デバッガの出力の内容を見てください。値はクエリオブジェクトであり、コメント付きコードのリストではありません。したがって、フラットビューを印刷する最初の呼び出しでは、メソッドメソッドはno timesと呼ばれています。印刷するときは9回と呼ばれます。その後、2回目の印刷呼び出しでさらに9回呼び出されます。あなたは、テストが現在アサートして渡したい場合は辞書を構築するときに、クエリを列挙:

output[example] = examples.Select(exampleMock.Object.ExampleMethod).ToList(); 
+0

残念ながらMacがIDEの失敗:(感謝の私のネットコア・プロジェクトのユニットテスト結果にデバッガを実行するためのVisual Studioに君は! – Syntax

関連する問題