C# FakeiTesy:从返回null的受保护方法获取参数

C# FakeiTesy:从返回null的受保护方法获取参数,c#,unit-testing,fakeiteasy,C#,Unit Testing,Fakeiteasy,我试图测试在受保护的虚拟方法中传递的参数,以确保属性设置正确。然而,下面的语句并没有设置我的变量,但Fakeitesy确实认识到正在进行此调用。我的语法不正确吗 单元测试 EmailEventArgs argsInEvent = null; A.CallTo(repository).Where(w => w.Method.Name == "OnSaveRequest") .Invokes(i => argsInEvent = i.GetArgument<EmailEv

我试图测试在受保护的虚拟方法中传递的参数,以确保属性设置正确。然而,下面的语句并没有设置我的变量,但Fakeitesy确实认识到正在进行此调用。我的语法不正确吗

单元测试

EmailEventArgs argsInEvent = null;

A.CallTo(repository).Where(w => w.Method.Name == "OnSaveRequest")
    .Invokes(i => argsInEvent = i.GetArgument<EmailEventArgs>(0))
    .MustHaveHappened(Repeated.Exactly.Once);

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

  • 造假
  • 配置fake以设置参数的捕获
  • 执行生产代码,该代码应使用伪代码,并且
  • 然后验证是否进行了呼叫
  • 我看不出你把电话打到哪里了 生产代码,但您的
    A.CallTo
    似乎正在尝试两者 配置方法并验证是否进行了调用。自从你 说
    一定发生过
    通过了,我猜这个代码 在调用生产代码后生存。比如:

    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);
    
    // 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
    

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

  • 造假
  • 配置fake以设置参数的捕获
  • 执行生产代码,该代码应使用伪代码,并且
  • 然后验证是否进行了呼叫
  • 我看不出你把电话打到哪里了 生产代码,但您的
    A.CallTo
    似乎正在尝试两者 配置方法并验证是否进行了调用。自从你 说
    一定发生过
    通过了,我猜这个代码 在调用生产代码后生存。比如:

    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);
    
    // 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
    

    我想这会让我失望的!问题。我一定坐在电脑前太久了,看不到调用是在我的生产代码调用之后!所以,是的,这是有效的。一如既往地谢谢。干杯。很高兴我能帮忙。如果有什么安慰的话,我最近看到了一些问题,最终得到了不同的答案。让我想知道是否有机会改进伪造的文档。对我来说,做“安排->配置假货,行动->让生产代码使用假货,断言->审问假货”是有道理的,但当你“在里面”的时候,很容易有这种感觉。嗯。我可能可以通过指向……来节省一些时间。我确实搜索了一个调用的示例,并阅读了《快速入门》和许多其他指南。我认为Quickstart让我大吃一惊,因为它只显示了调用语法,而我没有考虑生产调用(在我的示例中,这也是我应该告诉您的!)然而,如果我注意到流程的话,我应该向我展示AAA测试模式是一个伟大的TDD和单元测试模式-它使测试更干净、更容易理解,我认为这将是我的梦想!问题。我一定坐在电脑前太久了,看不到调用是在我的生产代码调用之后!所以,是的,这是有效的。一如既往地谢谢。干杯。很高兴我能帮忙。如果有什么安慰的话,我最近看到了一些问题,最终得到了不同的答案。让我想知道是否有机会改进伪造的文档。对我来说,做“安排->配置假货,行动->让生产代码使用假货,断言->审问假货”是有道理的,但当你“在里面”的时候,很容易有这种感觉。嗯。我可能可以通过指向……来节省一些时间。我确实搜索了一个调用的示例,并阅读了《快速入门》和许多其他指南。我认为Quickstart让我大吃一惊,因为它只是显示了调用语法,而我没有考虑生产调用(在我的示例中,这也是我应该告诉你的!)但是如果我注意到流程的话,我应该向我展示AAA测试模式是一个很棒的TDD和单元测试模式-它使测试更干净、更容易理解