Moq 验证以指定的顺序使用不同的参数调用相同的方法

Cri*_*scu 5 c# unit-testing moq

这是我需要进行单元测试的方法:

void Do(IEnumerable<string> items, TextWriter tw){
    foreach(var item in items) { tw.WriteLine(item); }
} 
Run Code Online (Sandbox Code Playgroud)

如何配置模拟TextWriter以验证某些参数是否以WriteLine特定顺序传递给相同的方法 ( )?

[Test]
public void Test(){
    var mock = new Mock<TextWriter>();
    mock.Setup( ??? ); //check that WriteLine is called 3 times, 
                       //with arguments "aa","bb","cc", in that order.

    Do(new[]{"aa", "bb", "cc"}, mock);
    mock.Verify();
}
Run Code Online (Sandbox Code Playgroud)

Ser*_*kiy 6

您可以使用回调来验证每个调用传递的参数:

[Test]
public void Test(){
    var arguments = new[]{"aa", "bb", "cc"};
    var mock = new Mock<TextWriter>();
    int index = 0;
    mock.Setup(tw => tw.WriteLine(It.IsAny<string>()))
        .Callback((string s) => Assert.That(s, Is.EqualTo(arguments[index++])));

    Do(arguments, mock.Object);
    mock.Verify();
    // check all arguments where passed
    Assert.That(index, Is.EqualTo(arguments.Length));
}
Run Code Online (Sandbox Code Playgroud)