nsubstitute收到特定对象参数的调用

8

我有一个类看起来像这样:

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
这是一个好的解决方案吗?链接 - Cristian Lupascu
@w0lf 是和否,我认为它会起作用,但我可能需要实现“IEquatable”,因为“List<>”可以是除“string”之外的其他对象类型的列表,谢谢。 - SOfanatic
你为什么混淆了 _realClass_mockedClass?我没有看到调用 CheckArgs() 的代码与 expectedArgNames 变量。你能否发布可重现的代码? - Alexandr Nikitin
1个回答

9
在您的测试中,您正在比较一个名为 myArguments 的类和 List<string>
您应该将 myArguments.argNamesList<string> 进行比较,或者在 myArguments 中实现 IEquatable<List<string>>
此外,在比较 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);
    }
}

使用第二个选项后,测试应该看起来像这样:x.ArgNames.Equals(expectedArgNames),是吗? 是的,我忘记包括 x.argNames.Equals - SOfanatic
不,使用第二个选项你会得到x.Equals - Marcio Rinaldi
对于任何想了解如何将第一个选项解决方案扩展到多个参数的人,请参考:https://dev59.com/d10Z5IYBdhLWcg3wiw_n#31316858 - youngrrrr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接