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

C# 类依赖于基类的受保护属性时的单元测试,c#,unit-testing,tdd,protected,base-class,C#,Unit Testing,Tdd,Protected,Base Class,MyBaseClass在流程管道中触发事件时,使用一些魔法初始化公共属性值 public class MyBaseClass { protected void OnSomeEvent(EventContext context) { SomeType = _someService.DoSomeLogic(context); } public SomeType SomeType { get; private set; } } 其他类中的流取决

MyBaseClass
在流程管道中触发事件时,使用一些魔法初始化公共属性值

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

    public SomeType SomeType { get; private set; } 
}
其他类中的流取决于初始化的
SomeType

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


在调用
Foo()之前设置
SomeType

在调用
Foo()之前设置
SomeType

\u someService看起来像一个外部依赖项。我将使用依赖项注入使外部依赖项可注入,然后使用模拟框架注入返回状态的内容,该状态将使其余测试通过


然后运行最终调用OnSomeEvent的public方法,您可以测试整个处理链

\u某些服务看起来像一个外部依赖项。我将使用依赖项注入使外部依赖项可注入,然后使用模拟框架注入返回状态的内容,该状态将使其余测试通过


然后运行最终调用OnSomeEvent的public方法,您可以测试整个处理链

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

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

[TestMethod]
public void Foo_ReturnsHuzzah()
{
    var result = new MyClass().Foo(); 
    Assert.IsHuzzah(result);   
}
然后在构造函数中使用空对象默认SomeType

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

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

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

[TestMethod]
public void Foo_ReturnsHuzzah()
{
    var result = new MyClass().Foo(); 
    Assert.IsHuzzah(result);   
}
然后在构造函数中使用空对象默认SomeType

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

“我想某个类型的人不应该有那个公共设置器。”签署啊,是的,好位置。setter应该是私有的。我想某些类型不应该有那个公共setter。@签名啊,是的,好位置。setter应该是私有的。很抱歉我在问题中出错,
SomeType
没有公共setter。很抱歉我在问题中出错,
SomeType
没有公共setter。我正在拨号
\u someService
。问题是我无法在SomeEvent上调用
-它是由ASP.NET管道调用的,但我不知道何时/如何调用。我正在使用
\u someService
。问题是我无法在SomeEvent上调用
-它是由ASP.NET管道调用的,但我不知道何时/如何调用。