C#FakeItEasy和方法链接:只识别第一个呼叫

时间:2015-02-12 14:51:51

标签: c# fluent-interface fakeiteasy

我调用了一个在命令处理程序中创建IMachine的工厂接口。从工厂返回的IMachine具有可以链接在一起以在构建器类中创建自身的方法。我现在遇到的FakeItEasy问题是它只识别第一个调用(WithSpeeds),除非我配置每个方法调用以返回假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);
}

1 个答案:

答案 0 :(得分:4)

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

问题是:

  1. _factory.CreateMachine会从您的设置
  2. 返回一个IMachinemachine
  3. machine.WithSpeeds返回FakeItEasy弥补的假IMachine。这是 machine,但是它是一个不同的假,称之为“machine2”
  4. machine2.WithOils返回另一台假机器
  5. 您的Assert块表明您希望在构建器链的每个步骤都返回相同的计算机。尝试插入

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

    之后

    那样machine会自行返回,并在其上设置相应的属性等等。