FakeItEasy:从受保护方法获取的参数返回null

时间:2014-08-07 16:45:57

标签: c# unit-testing fakeiteasy

我正在尝试测试受保护的虚方法中传递的参数,以确保正确设置属性。但是下面的声明并没有设置我的变量,但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
}

1 个答案:

答案 0 :(得分:4)

如果没有整个测试,有点难以分析是什么。典型的测试模式是:

  1. 制作假货
  2. 配置假设置以设置参数的捕获
  3. 执行生产代码,该代码应使用假货和
  4. 然后验证是否已拨打电话。
  5. 我看不到你在哪里打电话了 生产代码,但您的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