public class MyBaseClass
{
    protected void OnSomeEvent(EventContext context)
    {
         SomeType  = _someService.DoSomeLogic(context);
    }

    public SomeType SomeType { get; private set; }
}


MyBaseClass在流程管线中触发事件时,会发挥一些魔术作用来初始化公共属性值。

public class MyClass : MyBaseClass
{
    public string Foo()
    {
        if (SomeType.SomeLogic())
            throw new InvalidOpertaionException();

        return "huzzah";
    }
}


其他类中的流程取决于SomeType的初始化。

如何对MyClass.Foo()进行单元测试?

[TestMethod]
public void Foo_ReturnsHuzzah()
{
    var result = new MyClass().Foo();
    Assert.IsHuzzah(result);
}

最佳答案

这种类型的时间耦合(必须在调用Foo有效之前引发该事件)通常被认为是设计缺陷,因此,我要做的第一件事是重新访问设计以确保所拥有的是正确的。

如果您不想走这条路,最简单的解决方案是使用SomeType的Null Object实现初始化SomeType,就像这样...

class NullSomeType : SomeType
{
    public override bool SomeLogic() { return false; }
}


然后,默认将SomeType与Null对象一起放在构造函数中。

public MyBaseClass()
{
   SomeType = new NullSomeType();
}

关于c# - 类依赖于基类的 protected 属性时的单元测试,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8607951/

10-10 12:42