C#FakeItEasy和方法链接:仅识别首次调用

jmz*_*ski 2 c# fluent-interface fakeiteasy

我有一个到工厂接口的调用,该接口IMachine在命令处理程序中创建一个。IMachine从工厂返回的方法可以链接在一起,以在构建器类内部创建自己的方法。我FakeItEasy现在WithSpeeds遇到的问题是,除非我将每个方法调用都配置为返回false,否则它只能识别第一个调用(即)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)
  };
}
Run Code Online (Sandbox Code Playgroud)

测试

[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);
}
Run Code Online (Sandbox Code Playgroud)

Bla*_*rad 5

我认为,WithSpeedsWithOils都返回了IMachine,是吗?

问题是:

  1. _factory.CreateMachine返回一个IMachinemachine从你的设置
  2. machine.WithSpeeds返回由IMachineFakeItEasy组成的伪造品。这不是 machine,而是另一种假货,称其为“ machine2”
  3. machine2.WithOils 返回另一台假机器

您的Assert块建议您期望在构建器链的每个步骤都返回同一台机器。尝试插入

A.CallTo(machine)
    .WithReturnType<IMachine>()
    .Returns(machine);
Run Code Online (Sandbox Code Playgroud)

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

这样,machine它将继续返回自身,并且将在其上设置适当的属性,诸如此类。