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);
}
我认为 WithSpeeds
和 WithOils
都是 return 和 IMachine
,是吗?
问题是:
_factory.CreateMachine
returns 一个 IMachine
, machine
来自你的设置
machine.WithSpeeds
return 是 FakeItEasy 编造的假 IMachine
。这是 不是 machine
,而是不同的假货,称之为 "machine2"
machine2.WithOils
return又是一个假机器
您的 Assert 块表明您希望 同一台 机器在构建器链的每一步都被 returned。尝试插入
A.CallTo(machine)
.WithReturnType<IMachine>()
.Returns(machine);
在A.CallTo(() => _factory.CreateMachine()).Returns(machine);
之后
这样 machine
将保持 returning 自身,并在其上设置适当的属性等等。
我调用了在命令处理程序中创建 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);
}
我认为 WithSpeeds
和 WithOils
都是 return 和 IMachine
,是吗?
问题是:
_factory.CreateMachine
returns 一个IMachine
,machine
来自你的设置machine.WithSpeeds
return 是 FakeItEasy 编造的假IMachine
。这是 不是machine
,而是不同的假货,称之为 "machine2"machine2.WithOils
return又是一个假机器
您的 Assert 块表明您希望 同一台 机器在构建器链的每一步都被 returned。尝试插入
A.CallTo(machine)
.WithReturnType<IMachine>()
.Returns(machine);
在A.CallTo(() => _factory.CreateMachine()).Returns(machine);
这样 machine
将保持 returning 自身,并在其上设置适当的属性等等。