设计单元测试的业务类

时间:2010-02-25 10:26:24

标签: c# architecture

我正在尝试清理我的代码以使其可以进行单元测试。我知道必须在编码时创建单元测试但是......我现在必须完成它,代码已经完成。

我的业务类中充满了类似实现的方法,如:

var rep=new NHrepository<ModelClass1>(Session);
rep.Where(x=>x.Field1==1).ToList();

第一个错误(从我的角度来看)是我不必使用“new”而是使用DI并在ctor参数中添加一个INHrepository modelClass1Repository。

如果在我班上我有两个或更多不同型号的存储库?每个人都必须在ctor?或者业务类可能不是用SeparationOfConcern原则构建的?

3 个答案:

答案 0 :(得分:1)

你对依赖注入是正确的。

此外,如果您打算为遗留代码编写单元测试,我强烈建议您阅读Working Effectively with Legacy Code

答案 1 :(得分:1)

一种广泛使用的方法是将n个存储库作为您已经怀疑的构造函数的参数

另一种常用方法是使用依赖注入框架,例如Ninject。这允许您编写如下内容:

[Inject]
public IAbstractRepository<Company> companiesRepository { get; private set; }

[Inject]
public IAbstractRepository<User> usersRepository { get; private set; }

然后,您可以让Ninject根据使用场景注入适当的接口实现(例如,用于测试的虚假存储库或用于生产的真实存储库)

答案 2 :(得分:0)

您的业务类应该有一个带有2个参数的构造函数,每个存储库对应一个参数。您的企业应该公开2个接口,您的持久性应该提供他们的实现。