仅在 TFS 构建中出现 NSubstitute 参数匹配器错误

NSubstitute Argument Matcher Errors only in TFS Build

我遇到一个问题,在我的本地机器上使用 visual studio 测试成功,但是当我的 CI Build 在我的 TFS 服务器上运行它们时它们会失败。

这是失败的行和上下文的前一行。

var mockEventRepository = Substitute.For<IEventRepository>();
mockEventRepository.GetAll().ReturnsForAnyArgs(r => new List<Event>().AsQueryable());

请注意,没有参数匹配项!整个测试一个都没有。

TFS 会报错:

NSubstitute.Exceptions.UnexpectedArgumentMatcherException : Argument matchers (Arg.Is, Arg.Any) should only be used in place of member arguments. Do not use in a Returns() statement or anywhere else outside of a member call.

简而言之,这些错误在发生时似乎是一致的(相同的错误),但它们似乎也会随机发生或不发生。

例如...在原始构建失败后排队后续相同构建后才成功。然而,那一次当它尝试使用不同配置的相同构建时失败了,但出现了不同但相似且错误的错误:

NSubstitute.Exceptions.AmbiguousArgumentsException : Cannot determine argument specifications to use.

仅供参考,使用 TFS 2015 和 VS 2015。

简而言之,整个问题是由一个旧测试引起的,该测试在没有使用 NSubstitute 的情况下错误地包含了 Arg 匹配器。

我在这里学到的教训是,这种情况会产生非常不准确的错误,我会敦促遇到此类问题的任何人检查 Arg 匹配器的所有用途。

我在将 NSubstitute 与默认并行运行测试 类 的 xunit 一起使用时看到了这个问题。 NSubstitute 一定存在线程问题,因为关闭并行化为我们修复了它。在您的测试项目中 AssemblyInfo.cs 添加

[assembly: CollectionBehavior(DisableTestParallelization = true)]