![](/img/trans.png)
[英]Faking a generic method call in C# is not returning the correct object with 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);
}
我认为WithSpeeds
和WithOils
都返回IMachine
,是吗?
问题是:
_factory.CreateMachine
从您的设置中返回一台IMachine
machine
machine.WithSpeeds
返回由IMachine
的虚假IMachine
。 这不是 machine
,而是另一种假货,称其为“ machine2” 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.