当类依赖于基类的受保护属性时的单元测试

时间:2011-12-22 17:53:38

标签: c# unit-testing tdd protected base-class

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

3 个答案:

答案 0 :(得分:3)

_someService看起来像是外部依赖项。我会使用依赖注入来使外部依赖注入,然后使用模拟框架注入一些返回状态的东西,这将使其余的测试通过。

然后运行最终调用OnSomeEvent的公共方法,并且可以测试整个处理链

答案 1 :(得分:2)

这种类型的时间耦合(事件必须在调用Foo之前提出才有效)通常被认为是一个设计缺陷,所以我要做的第一件事是重新设计以确保我所拥有的是右。

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

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

然后在构造函数中使用Null对象默认SomeType。

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

答案 2 :(得分:0)

在致电SomeType

之前设置Foo()