【问题标题】:FakeItEasy - I cannot see if a protected method was called when the caller method is protected overridenFakeItEasy - 当调用者方法被保护覆盖时,我看不到是否调用了受保护的方法
【发布时间】:2022-02-11 00:01:04
【问题描述】:

我是 FakeItEasy 的新手,如果解决方案很明显,我很抱歉。

这是重现问题的简化代码:

我有一个基类:

public abstract class BaseClass
    {
        public void Do()
        {
            Do_Override();
        }

        protected abstract void Do_Override();
    }

还有一个派生的:

  public class ImplementingClass: BaseClass
    {
        protected override void Do_Override()
        {
            ProtectedDo();
        }

        protected virtual void ProtectedDo()
        {

        }        
    }

在我的测试中,我想查看是否调用了 ProtectedDo()。我尝试以两种方式进行测试,但测试失败并显示相同的消息:

第一。在调试模式下它没有进入Do_Override()

 public class ImplementingClassShould
    {
        [Fact]
        public void Run_ProtectedDo()
        {
            var fake = A.Fake<ImplementingClass>();
            fake.Do();
            A.CallTo(fake).Where(_ => _.Method.Name == "ProtectedDo").MustHaveHappened();

        }
     }

第二。在调试模式下,它进入Do_Override()

 public class ImplementingClassShould
    {    
        [Fact]
        public void Run_ProtectedDo_V2()
        {
            var sut = new ImplementingClass();
            var sutFakeWrapper = A.Fake<ImplementingClass>(_ => _.Wrapping(sut));
            sutFakeWrapper.Do();
            A.CallTo(sutFakeWrapper).Where(_ => _.Method.Name == "ProtectedDo").MustHaveHappened();

        }        
    }

失败消息:

【问题讨论】:

  • 嗨,@fmm。我喜欢简化的重现,但通常最好指出您的经验中出了什么问题。例如,您为什么不认为您的代码有效?
  • 嗨,@BlairConrad。我已经用测试失败的消息更新了我的问题。也是我第二次尝试测试。谢谢。

标签: unit-testing fakeiteasy


【解决方案1】:

就目前而言,您的测试非常好。如果你运行它,它会告诉你ProtectedDo 没有被调用,这是准确的。因为Do_Override 是虚拟的,所以FakeItEasy 会拦截调用。 (在这种情况下,保护不会影响事物。)

如果你不希望Do_Override被FakeItEasy拦截,你应该将Fake配置为call the base method而不是自己处理调用:

[Fact]
public void Run_ProtectedDo()
{
    var fake = A.Fake<ImplementingClass>();

    A.CallTo(fake).Where(_ => _.Method.Name == "Do_Override").CallsBaseMethod();

    fake.Do();
    A.CallTo(fake).Where(_ => _.Method.Name == "ProtectedDo").MustHaveHappened();

}

根据新添加的Run_ProtectedDo_V2 测试进行更新:

我希望你已经知道这一点,@fmm,但测试仍然失败。这是因为当sutFakeWrapper.Do 被调用时,它会转发到包装好的sut.Do。由于sut是一个具体的ImplementingClass,它调用它的Do_Override,它调用它的ProtectedDo,所以可以调试成ProtectedDo方法调用。只有sut.ProtectedDo,而不是sutFakeWrapper.ProtectedDo。因此测试失败。

【讨论】:

    猜你喜欢
    • 2013-07-01
    • 1970-01-01
    • 2011-08-04
    • 2015-10-01
    • 2012-05-14
    • 1970-01-01
    • 1970-01-01
    • 2012-06-25
    • 2019-12-06
    相关资源
    最近更新 更多