2

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

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

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

请注意,没有参数匹配器!在整个测试中没有一个。

TFS 会报错:

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

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

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

NSubstitute.Exceptions.AmbiguousArgumentsException :无法确定要使用的参数规范。

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

4

2 回答 2

2

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

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

于 2015-11-14T00:58:30.413 回答
1

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

[assembly: CollectionBehavior(DisableTestParallelization = true)]

https://stackoverflow.com/a/34876963/1128742

于 2017-07-07T14:58:18.703 回答