为什么在一组单元测试中使用 NSubstitue.Arg.Any<string> 会导致另一组中的最后一个测试失败

Why does using NSubstitue.Arg.Any<string> in one group of unit tests cause the last test in another set to fail

我们有一个非常奇怪的错误,其中 运行 使用一组新的单元测试来连接我们的完整单元测试套件总是会导致新部分中的最后一个测试 运行 失败(使用 ReSharper 和 NUnit Unity3D 项目)。然而 运行 新集本身所有的测试都会通过。

奇怪的是,更改失败单元测试的命名会导致整个套件以看似 运行dom 的方式通过。我们删除了世界“_Multiple”,它似乎一直有效,直到我们添加了一个新测试并且该测试失败但其中根本没有“_Multiple”这个词。在这一点上,我知道发布的命名是一个转移注意力的问题,而不是问题的真正原因。它还在多台机器上进行了测试,并且总是遇到相同的行为。

我们最终通过在非 NSubstitute 对象上使用 Arg.Any 的一组单元测试 运行 缩小了失败范围,基本上 运行

Assert.That(!string.Equals("Desired Value", Arg.Any<string>()));

一旦我们发现很明显我滥用了 Arg.Any() 函数。

我的问题是,为什么更改函​​数的名称会影响测试?为什么将所有测试重命名为 test1()、test2()、test3() 等每次都允许所有测试通过,而更具描述性的名称不会?

NSubstitute 用静态做一些可怕的事情来获得它的特定语法。 Arg.xyz 调用将参数规范添加到全局队列,一旦调用替代项,这些参数规范就会被清除。

我猜测更改测试的名称会导致它们 运行 的顺序发生变化,进而导致问题暴露或隐藏。在一个特定的排序中,对清除错误 Arg.Any<string>() 规范的替代进行调用,而对于另一种排序,规范导致真正的调用被视为配置存根值,或由于参数不匹配而抛出。