【问题标题】:Unit test when class has dependency on protected property of base class当类依赖于基类的受保护属性时的单元测试
【发布时间】:2012-01-26 08:02:38
【问题描述】:
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);   
}

【问题讨论】:

  • 我认为 SomeType 不应该有那个公共设置器。
  • @Sign 啊是的好地方。 setter 应该是私有的。

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


【解决方案1】:

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

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

【讨论】:

  • 我在 DIing _someService。问题是我无法调用 OnSomeEvent - 它由 ASP.NET 管道调用,但我不知道何时/如何。
【解决方案2】:

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

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

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

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

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

【讨论】:

    【解决方案3】:

    在调用Foo()之前设置SomeType

    【讨论】:

    • 对不起,我在问题中犯了一个错误,SomeType 没有公共设置器。
    猜你喜欢
    • 2021-05-31
    • 1970-01-01
    • 1970-01-01
    • 2011-06-06
    • 2021-10-07
    • 1970-01-01
    • 2013-01-08
    • 2017-10-29
    • 2014-11-20
    相关资源
    最近更新 更多