nsubstitute收到调用特定对象参数

时间:2015-08-27 14:01:42

标签: c# unit-testing nsubstitute

我有一个看起来像这样的课程:

public myArguments
{
    public List<string> argNames {get; set;}
}

在我的测试中,我这样做:

var expectedArgNames = new List<string>();
expectedArgNames.Add("test");

_mockedClass.CheckArgs(Arg.Any<myArguments>()).Returns(1);

_realClass.CheckArgs();

_mockedClass.Received().CheckArgs(Arg.Is<myArguments>(x => x.argNames.Equals(expectedArgNames));

但测试失败并显示以下错误消息:

NSubstitute.Exceptions.ReceivedCallsException : Expected to receive a call matching:
    CheckArgs(myArguments)
Actually received no matching calls.
Received 1 non-matching call (non-matching arguments indicated with '*' characters):
    CheckArgs(*myArguments*)

我猜这是因为.Equals(),但我不确定如何解决它?

1 个答案:

答案 0 :(得分:5)

在测试中,您要将myArguments课程与List<string>进行比较。

您应该将myArguments.argNamesList<string>进行比较,或在IEquatable<List<string>>中实施myArguments

此外,当您比较List<T>时,您应该使用SequenceEquals代替Equals

第一个选项是:

_mockedClass.Received().CheckArgs(
    Arg.Is<myArguments>(x => x.argNames.SequenceEqual(expectedArgNames)));

第二个是:

public class myArguments : IEquatable<List<string>>
{
    public List<string> argNames { get; set; }

    public bool Equals(List<string> other)
    {
        if (object.ReferenceEquals(argNames, other))
            return true;
        if (object.ReferenceEquals(argNames, null) || object.ReferenceEquals(other, null))
            return false;

        return argNames.SequenceEqual(other);
    }
}