我调用了一个在命令处理程序中创建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);
}
答案 0 :(得分:4)
我认为WithSpeeds
和WithOils
都返回IMachine
,是吗?
问题是:
_factory.CreateMachine
会从您的设置IMachine
,machine
machine.WithSpeeds
返回FakeItEasy弥补的假IMachine
。这是不 machine
,但是它是一个不同的假,称之为“machine2”machine2.WithOils
返回另一台假机器您的Assert块表明您希望在构建器链的每个步骤都返回相同的计算机。尝试插入
A.CallTo(machine)
.WithReturnType<IMachine>()
.Returns(machine);
在A.CallTo(() => _factory.CreateMachine()).Returns(machine);
之后
那样machine
会自行返回,并在其上设置相应的属性等等。