我正在尝试测试受保护的虚方法中传递的参数,以确保正确设置属性。但是下面的声明并没有设置我的变量,但FakeItEasy确实认识到正在进行此调用。我的语法不正确吗?
单元测试
EmailEventArgs argsInEvent = null;
A.CallTo(repository).Where(w => w.Method.Name == "OnSaveRequest")
.Invokes(i => argsInEvent = i.GetArgument<EmailEventArgs>(0))
.MustHaveHappened(Repeated.Exactly.Once);
存储库中的方法
private void onSaveSetupEmailArgs(string callerName, int pk)
{
EmailEventArgs args = new EmailEventArgs();
// ..set property logic
OnSaveRequest(args); // the protected virtual method
}
答案 0 :(得分:4)
如果没有整个测试,有点难以分析是什么。典型的测试模式是:
我看不到你在哪里打电话了
生产代码,但您的A.CallTo
似乎正在尝试
配置方法并验证是否进行了调用。自从你
说MustHaveHappened
通过,我猜这个代码
在调用生产代码之后生活。类似的东西:
var repository = A.Fake<IRepository>();
repository.SaveSetup(…);
EmailEventArgs argsInEvent = null;
A.CallTo(repository).Where(w => w.Method.Name == "OnSaveRequest")
.Invokes(i => argsInEvent = i.GetArgument<EmailEventArgs>(0))
.MustHaveHappened(Repeated.Exactly.Once);
这不起作用(当然你知道,或者你不会问一个问题),因为你在生成代码之后配置了Invokes
(并且OnSaveRequest
已经对假冒电话进行了调用。
你应该有类似的东西:
// Arrange
EmailEventArgs argsInEvent = null;
var repository = A.Fake<IRepository>();
A.CallTo(repository).Where(w => w.Method.Name == "OnSaveRequest")
.Invokes(i => argsInEvent = i.GetArgument<EmailEventArgs>(0));
// Act
repository.SaveSetup(…);
// Assert
A.CallTo(repository).Where(w => w.Method.Name == "OnSaveRequest")
.MustHaveHappened(Repeated.Exactly.Once);
// and maybe do something with argsInEvent