N仅在TFS内部版本中存在替换参数匹配器错误



我遇到一个问题,使用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.AmbiqueArgumentsException:无法确定要使用的参数规范。

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

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

我在这里学到的教训是,这种类型的场景可能会产生非常不准确的错误,我敦促任何遇到这种问题的人回顾Arg匹配器的所有使用。

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

[assembly: CollectionBehavior(DisableTestParallelization = true)]

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

最新更新