Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Moq验证以指定的顺序使用不同的参数调用相同的方法_C#_Unit Testing_Moq - Fatal编程技术网

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

C# Moq验证以指定的顺序使用不同的参数调用相同的方法,c#,unit-testing,moq,C#,Unit Testing,Moq,下面是我需要进行单元测试的方法: void Do(IEnumerable<string> items, TextWriter tw){ foreach(var item in items) { tw.WriteLine(item); } } 您可以使用Callback验证每个调用传递的参数: [Test] public void Test(){ var arguments = new[]{"aa", "bb", "cc"}; var mock = new

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

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

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

[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));
}
[测试]
公开无效测试(){
变量参数=新[]{“aa”、“bb”、“cc”};
var mock=new mock();
int指数=0;
mock.Setup(tw=>tw.WriteLine(It.IsAny()))
.Callback((字符串s)=>Assert.That(即.EqualTo(参数[index++])));
Do(参数,mock.Object);
mock.Verify();
//检查传递的所有参数
Assert.That(index,Is.EqualTo(arguments.Length));
}

很酷。我试图用tw.WriteLine实现类似的功能(It.Is(s=>{save result,return true})),但这无法编译。不过,您的答案不是防弹的。
Do
方法可以提前返回,例如在第一项之后,测试就会通过。那么,只需添加
Assert.That(index,Is.EqualTo(arguments.Length))
在测试结束时,我选择了
mock.Verify(tw=>tw.WriteLine(It.IsAny()),Times
但我认为你的方法更直截了当。@CristiDiaconescu我认为
次。确切地说(3)
也很好。实际上我忘记了
时间
参数:)
[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));
}