NSubstitute测试单独工作,但在套件中抛出Unexpected Matcher Argument

时间:2016-12-02 00:23:25

标签: c# nsubstitute

我有一个单元测试,我使用.Returns()返回一些示例数据:

    [TestMethod]
    public void TestRetrieveElementsInVersion()
    {
        IRetrieveElementSequence component = Substitute.For<IRetrieveElementSequence>();
        List<UnconstructedElement> list = new List<UnconstructedElement>
        {
            new UnconstructedElement{Version = "1"},
            new UnconstructedElement{Version = "2"}
        };
        component.RetrieveElements().Returns(list); // exception reported here
        const string target = "1";
        IRetrieveElementSequence service = new RetrieveElementsInAVersion(component, target);
        IList<UnconstructedElement> result = service.RetrieveElements();
        bool check = result.All(e => e.Version == target);
        Assert.IsTrue(check);
    }

当单独运行测试时,此代码使用ReSharper运行程序在Visual Studio中传递。当它作为列表的一部分运行时失败,就像我从解决方案运行所有测试一样。

NSubstitute.Exceptions.UnexpectedArgumentMatcherException:参数匹配器(Arg.Is,Arg.Any)应仅用于代替成员参数。不要在Returns()语句或成员调用之外的任何其他地方使用。

我看不到我在哪里使用Arg.Any或Arg.Is.我在做什么让NSubstitute抱怨?当我使用.Returns()返回非本机对象列表时会发生这种情况。

2 个答案:

答案 0 :(得分:7)

这很大程度上是因为之前的测试使用了针对非虚方法的参数匹配器,或者是Returns语句。

不幸的是,调试起来非常棘手。第一步是查看在此夹具中运行所有测试时是否出现问题。如果是这样,请检查该夹具中Arg.Is|Any的所有用法,从在测试失败之前运行的那个开始(如果您的测试框架使用可预测的测试订单,否则您需要查看测试日志到看看哪些测试进行了失败的测试。

如果没有使用该灯具,您需要查看预先运行的灯具,以查看左侧arg匹配器的来源。它很可能在失败的测试附近。

答案 1 :(得分:0)

在我的情况下,这是对exension方法的Received()调用(可能是因为它不是虚拟的)。 所以我回到了我的拉取请求,并删除了它的每个实例,然后它就起作用了。