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管道调用的,但我不知道何时/如何调用。