1

我正在为我正在开发的应用程序的一个新模块寻找一些设计建议,特别是关于如何使设计可测试。

这个问题很常见——从数据库中加载一些数据,对数据运行一些操作,然后将结果保存到数据库中。应用程序中的大多数其他模块具有以下模式:

private repo; //Set in constructor
public void Run() 
{
    Stuff stuff = repo.LoadStuff()
    Result result = RunOperationsInPrivateMethod(stuff); //private method
    repo.SaveResult(result);
}

所以为了测试这个,我发现我有几个选择:

  1. 注入一个模拟仓库,我可以用它来返回一个东西并验证一个结果。
  2. 重构 RunOperationsInPrivateMethod 以保护访问,并直接测试操作。

我错过了任何其他选择吗?人们的喜好是什么?

4

1 回答 1

4

一般来说,不要测试私有方法,而是考虑你的私有方法是否真的应该是另一个类的公共方法。即,将您的对象分解为具有集中功能的较小对象。

例如,也许 Run 应该是

private repo; //Set in constructor
private IOperation operation; // injected in constructor or through dependency injection.
public void Run() 
{
    Stuff stuff = repo.LoadStuff()
    Result result = operation.Run(stuff); //private instance with public method
    repo.SaveResult(result);
}

然后 Run 将是操作类的公共方法

class SecretOperation : IOperation
{
   public void Run(Stuff stuff) { /* secret stuff */ }
}

然后,您不必从数据库加载 Stuff 进行测试,只需在专注于测试 SecretOperation 的夹具中创建一个东西。现在您的单元测试可以更加集中。

于 2012-11-23T08:50:48.967 回答