【发布时间】:2012-12-20 08:59:38
【问题描述】:
我有一个类,其唯一目的是通过接口在其他类上运行方法。
测试类的接口没有问题,但是运行器实际上并没有做任何事情,并且(就目前而言)传递给构造函数的唯一参数是私有的。
在我的例子中,这些类将文本文件导入数据库。
internal DataImporter
{
private List<IFileImporter> _importers;
public DataImporter(List<IFileImporter> importers){
_importers = importers;
public bool RunImporters()
{
//foreach importer, call its "Run" method - each one then does whatever it needs to do
//however, this need not call a specific "Run" method on IFileImporter
//I have another app that uses IFileImporter to check for presence of a file first
//then allow user to choose to import or not.
}
在我看来这里没有什么可以测试的?我无法测试_importers 的值,也不想仅仅为了测试而将其公开。 DataImporter 是特定于这个实例的,所以创建一个接口似乎没有任何好处。
我在其他地方重用了 IFileImporters,但这是唯一的“批量”导入器,其他的是从 winforms 应用程序手动调用的,还有一些根本不在这个项目中。
那么,我需要对此进行测试吗...我可以对此进行什么测试?
【问题讨论】:
-
如果这样的 void 方法改变了对象的状态,或者进行了任何外部调用,您可能仍然希望通过测试最终结果而不是具体的返回值来测试它。
-
@ryadavilli - 我同意。现在我正在创建一个从数据库中删除对象的单元测试。该方法返回void,但我仍然可以检查它是否存在于数据库中。
-
对象实际上是“Main”方法,但使用强类型 List<...> 而不是参数。当前大约 30 个具体的 Importers 中的每一个实际上都在做一些事情……但是这个类只是运行它们的一种方式。我实际上可以将其设为静态并将 List 传递给 Run 方法(也许我应该!)
-
那么,添加一个“已知”的测试导入器,将它添加到我的类中,检查它是否需要“一个文件”并将其导入到“一个目的地”?
-
查看 Moq 或等效的模拟框架。它可以设置一个 IFileImporter 的 Mock,您可以使用它来指定所需的行为(返回 True 或 False、抛出异常等)以及断言它是否被调用。
标签: c# unit-testing nunit moq