CSharp - 在一行中,Moq测试在独立执行时运行 ok,但在执行时失败

  显示原文与译文双语对照的内容

我们使用了that来执行一些单元测试,也许有些奇怪的行为,也许是一些配置问题。
基本上,我有 2个测试( 调用 Windows 工作流,调用自定义活动,调用方法调用调用。 我不知道这是否有用,但我想提供尽可能多的信息。 单独执行测试时运行,但如果在同一运行中执行,第一次和第二次失败( 2nd 个总是失败)

每次都重新创建模拟,使用Unity加载。 比如:


MockProcessConfigurator = MockFactory.Create<IProcessConfigurator>();
 MockProcessConfigurator.Setup(x => x.MyMethod(It.IsAny<Order>()));
[...]
InversionOfControl.Instance.Register<IProcessConfigurator>(MockProcessConfigurator. Object)

调用的调用( WF自定义活动) 为


var invoker = new WorkflowInvoker(new MyWorkflow());
invoker.Invoke(inputParameter);

调用( 调用的调用) 是


MyModuleService.ProcessConfigurator.MyMethod(inputOrder);

在调试时,我看到ProcessConfigurator总是被模仿。

在测试中失败的调用就像下面这样简单:


MockEnvironment.MockProcessConfigurator.Verify(x => x.MyMethod(It.IsAny<Order>()), Times.Exactly(1));

调试时,实际上每次调用该方法,因这里我怀疑有一些worng与模拟实例有关。 我在这里有点丢失,因为看起来正确实现,但是在某些原因下,有一个问题。

时间: 作者:

这种类型的错误通常发生在两个测试共享某些内容时。

比如在测试设置中设置一个方法 1时间,然后每次调用 1次测试,因为现在已经调用了 2次,所以你的模拟设置。

建议你将期望设置移动到每个测试中。

作者:

此类问题的一般解决方法是尝试隔离两个测试之间的依赖关系。

  1. 将任何设置代码移动到测试中。
  2. 将任何down代码移到测试内。
  3. 将任何字段初始值设定项移动到测试中。 ( 每个夹具只运行一次) !

这应该使你的测试在一起运行时。 当你得到绿色的灯光时,你可以在每次修改的时候重新开始复制复制的东西到初始化/设置( 在你每次修改的时候) 。

你应该能够了解在测试之间造成这种耦合的原因。 祝你好运

作者:

为了扩展 Sohnee,的答案,我将检查安装/拆除方法以确保正确地整理所有的内容。 我在批量运行测试时遇到类似的问题,而没有整理我的模拟对象。

作者:

我不知道这是不是相关但 MockFactory.Create 看起来很奇怪。 我通常按如下方式创建 mock:


var mockProcessConfigurator = new Mock<IProcessConfigurator>();

在使用 MockFactory ( 我根本不需要) 时,通常会创建它的一个实例。 从 moq快速入门:


var factory = new MockFactory(MockBehavior.Strict) { DefaultValue = DefaultValue.Mock };

在MockFactory上调用 static 方法似乎破坏了目标。 如果你有一个非标准的命名约定,MockFactory实际上是MockFactory类型的变量,那可以能不是你的。 如果MockFactory是你的测试类的属性,请确保在安装时重新创建它。

如果可能的话,我会消除工厂,因为它是共享状态的潜在来源。

EDIT: 作为 an,WorkflowInvoker.Invoke 以活动作为参数。 你可以只传递定制活动的实例,而不是创建整个工作流来测试自定义活动。 如果这就是你想测试的话,它会使你的单元测试 更加焦点。

作者:

我想我会添加一个额外的情况和解决方案,我刚刚遇到这个问题。

如果你在同一时间运行两个单独的项目,并且每个项目都使用不同版本的,。 对于我,我使用 TestProjectA Moq 4.2.14和 TestProjectB,使用最小 Moq 4.2.15的事故( 承蒙Nuget提供) 。 当从A 和B 测试运行测试时,第一个测试成功,第二个测试失败。

调整两个项目以使用相同的版本解决了这个问题。

作者:
...