繁体   English   中英

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

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

我有一个到工厂接口的调用,该工厂接口在命令处理程序中创建了IMachine 从工厂返回的IMachine具有可以链接在一起的方法,以在构建器类内部创建自身。 我现在用FakeItEasy的问题是,除非我将每个方法调用都配置为返回假IMachine否则它只能识别第一个调用(即WithSpeeds )。 有没有一种方法可以不配置每个单个调用,或者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都返回IMachine ,是吗?

问题是:

  1. _factory.CreateMachine从您的设置中返回一台IMachine machine
  2. machine.WithSpeeds返回由IMachine的虚假IMachine 不是 machine ,而是另一种假货,称其为“ machine2”
  3. machine2.WithOils返回了另一台伪造的计算机

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

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

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

这样一来, machine将不断返回自身,并且将在其上设置适当的属性,而不会设置其他属性。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM