【发布时间】:2016-02-12 00:08:36
【问题描述】:
我遇到了一个问题,即使用 Visual Studio 在我的本地计算机上成功进行测试,但当我的 CI 构建在我的 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。
【问题讨论】:
-
是否有可能在此之前运行的测试中使用了 arg 匹配器?如果有一些正在排队但未使用,它们可能会影响后续测试。间歇性可能是由于测试以不同的顺序运行。
-
感谢大卫的洞察力。测试之间没有共享任何东西,所以除非 NSubstitute 缓存它的代理,否则我不知道是不是这样。我确实有一种强烈的感觉,它测试了与它有关的执行顺序。实际上,我现在确实设法让它在 VS 中失败,它似乎比在 VS 上失败的频率更高,而在 TFS 中失败的频率更高。
-
我实际上怀疑真正的错误是 AmbiguousArgumentsException 并且它是由于在使用 IMappingEngine 模拟 AutoMapper 时未使用 2 通用参数方法引起的。正在进行一些修改,如果结果是修复,将发布答案!
-
好吧,我更改了所有 AutoMapper 子程序以使用 ReturnsForAll,因为这是在不重写应用程序以停止利用泛型类型推断的情况下消除歧义的唯一可接受的方法。虽然这似乎修复了 AmbiguousArgumentExceptions,但它在参数匹配器方面仍然随机失败。
-
然后我仔细观察了执行的顺序,发现它似乎确实很重要。我将 Returns 语句更改为 ReturnsForAnyArgs 并删除了参数匹配器,现在我似乎无法再让任何测试失败,尽管我认为我再也没有看到相同的失败执行顺序......
标签: tfs automapper xunit nsubstitute vstest