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