【发布时间】:2010-04-29 15:33:21
【问题描述】:
我有一个具有一个公共方法和许多私有方法的类,这些方法的运行取决于传递给公共方法的参数,因此我的代码如下所示:
public class SomeComplexClass
{
IRepository _repository;
public SomeComplexClass()
this(new Repository())
{
}
public SomeComplexClass(IRepository repository)
{
_repository = repository;
}
public List<int> SomeComplexCalcualation(int option)
{
var list = new List<int>();
if (option == 1)
list = CalculateOptionOne();
else if (option == 2)
list = CalculateOptionTwo();
else if (option == 3)
list = CalculateOptionThree();
else if (option == 4)
list = CalculateOptionFour();
else if (option == 5)
list = CalculateOptionFive();
return list;
}
private List<int> CalculateOptionOne()
{
// Some calculation
}
private List<int> CalculateOptionTwo()
{
// Some calculation
}
private List<int> CalculateOptionThree()
{
// Some calculation
}
private List<int> CalculateOptionFour()
{
// Some calculation
}
private List<int> CalculateOptionFive()
{
// Some calculation
}
}
我想了几种方法来测试这个类,但它们似乎都过于复杂,或者暴露的方法比我想要的要多。到目前为止的选项是:
将所有私有方法设置为 internal 并使用 [assembly: InternalsVisibleTo()]
将所有私有方法分离成一个单独的类并创建一个接口。
将所有方法设为虚拟,并在我的测试中创建一个继承自此类的新类并覆盖这些方法。
是否有任何其他选项可以测试上述课程,这会比我列出的更好?
如果你会选择我列出的其中一个,你能解释一下原因吗?
谢谢
【问题讨论】:
-
这与您的问题无关,但 if/else 结构让我觉得很奇怪。从设计的角度来看,您是否经常让该类的客户端调用多种类型的计算,或者单个客户端通常只调用一个选项?
-
这是我实际课程的简化版本,但许多客户通常会调用很多选项。
标签: unit-testing testing dependency-injection mocking separation-of-concerns