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);
}
答案 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()