【问题标题】:FakeItEasy: Get Arguments from protected method returning nullFakeItEasy:从返回 null 的受保护方法中获取参数
【发布时间】:2014-08-08 01:49:04
【问题描述】:

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

【问题讨论】:

    标签: c# unit-testing fakeiteasy


    【解决方案1】:

    如果没有整个测试,很难判断发生了什么。典型的测试模式是:

    1. 造假
    2. 配置 fake 以设置参数的捕获
    3. 执行生产代码,应该使用假的,并且
    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
    

    【讨论】:

    • 我想这会在我的杜赫!问题。我一定是在我的电脑前坐了太久才看到调用是在我的生产代码调用之后!所以是的,这有效。一如既往的感谢。
    • 干杯。很高兴我能帮上忙。如果有什么安慰的话,我最近看到一些问题最终得到了这个答案的变体。让我想知道是否有机会改进 FakeItEasy 文档。对我来说,做“安排 -> 配置假货,行动 -> 让生产代码使用假货,断言 -> 询问假货”是有道理的,但是当你“在里面”时很容易有这种感觉。唔。我可以通过指向Quickstart 来节省一些时间...
    • 我确实搜索了一个调用示例,并阅读了快速入门以及许多其他指南。我认为 Quickstart 让我大吃一惊,因为它只是显示了调用语法,而我没有考虑生产调用。(在我的示例中我也应该这样做!)但是如果我注意流程,this post 应该向我展示
    • AAA 测试模式是一个很好的 TDD 和单元测试模式 - 它使测试更清晰,更容易理解
    猜你喜欢
    • 2014-10-30
    • 2021-09-02
    • 1970-01-01
    • 1970-01-01
    • 2016-09-08
    • 2011-02-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多