C# FakeItEasy 和方法链:只识别第一个调用

C# FakeItEasy and Method Chaining: Only First Call Is Recognized

我调用了在命令处理程序中创建 IMachine 的工厂接口。这个来自工厂的 returned IMachine 具有可以链接在一起以在构建器 class 中创建自身的方法。我现在 运行 遇到 FakeItEasy 的问题是它只识别第一个调用(即 WithSpeeds),除非我将每个方法调用配置为 return 假 IMachine。有没有办法不配置每个调用或让 FakeItEasy 识别链上的每个方法调用?我知道我一定是做错了什么,因为如果我使用 OrderAssertions,并且在没有设置我的假机器的情况下故意使订单失败,这表明对所有方法都进行了调用。感谢您的帮助。

命令处理程序方法的一部分

public void Handle(FooCommand commandParm)
{
  var entity = new Entity.Builder 
  { 
    Machine = _factory.CreateMachine(commandParm.MachineName)
                .WithSpeeds(commandParm.ProcessingSpeed, commandParm.StartupSpeed, commandParm.ShutDownSpeed)
                .WithOils(commandParm.Lubrication, commandParm.FinishingOil)
  };
}

测试

[TestMethod]
public void HandleSetMachineSettings_should_build_machine()
{
  // Arrange
  var settings = CommandUtilities.ReturnFooCommand();
  var _factory = A.Fake<IMachineFactory>();
  var machine = A.Fake<IMachine>();
  A.CallTo(() => _factory.CreateMachine(settings.MachineName)).Returns(machine);

  // Act
  _handler.Handle(settings);

  // Assert
  machine.Should().NotBeNull();
  A.CallTo(machine).Where(x => x.Method.Name.Equals("set_MachineNumber")).WhenArgumentsMatch(arg => arg.Get<int>(0) == settings.MachineNumber).MustHaveHappened(Repeated.Exactly.Once);
  A.CallTo(() => machine.WithSpeeds(commandParm.ProcessingSpeed, commandParm.StartupSpeed, commandParm.ShutDownSpeed)).MustHaveHappened(Repeated.Exactly.Once);
  A.CallTo(() => machine.WithOils(commandParm.Lubrication, commandParm.FinishingOil)).MustHaveHappened(Repeated.Exactly.Once);
}

我认为 WithSpeedsWithOils 都是 return 和 IMachine,是吗?

问题是:

  1. _factory.CreateMachine returns 一个 IMachine, machine 来自你的设置
  2. machine.WithSpeeds return 是 FakeItEasy 编造的假 IMachine。这是 不是 machine,而是不同的假货,称之为 "machine2"
  3. machine2.WithOilsreturn又是一个假机器

您的 Assert 块表明您希望 同一台 机器在构建器链的每一步都被 returned。尝试插入

A.CallTo(machine)
    .WithReturnType<IMachine>()
    .Returns(machine);

A.CallTo(() => _factory.CreateMachine()).Returns(machine);

之后

这样 machine 将保持 returning 自身,并在其上设置适当的属性等等。