我应该对没有显而易见返回值的方法进行单元测试吗?

3
我有一个类,其唯一目的是从接口运行其他类的方法。
测试类的接口没有问题,但是运行程序实际上什么也没做,而且(按照现在的情况)传递到构造函数中的唯一参数被保持为私有。
在我的情况下,这些类正在将文本文件导入数据库。
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应用程序中调用,还有一些根本不在此项目中。

那么,我需要测试这个……我能对此进行什么测试呢?


2
如果这样的void方法改变了对象的状态或进行了任何外部调用,您可能仍然希望通过测试最终结果而不是特定的返回值来测试它。 - Ravi Y
@ryadavilli - 我同意。现在我正在创建一个单元测试,用于从数据库中删除对象。该方法返回void,但我仍然可以检查它是否存在于数据库中。 - Stian Standahl
该对象实际上是“Main”方法,但使用强类型的List<...>而不是params。目前约30个具体的导入程序中的每一个都实际执行某些操作...但这个类只是一种运行它们的方式。我实际上可以将其设置为静态并将List传递到Run方法中(也许我应该这样做!) - BlueChippy
那么,添加一个“已知”的测试导入器,将其添加到我的类中,检查它是否接受“文件”并将其导入到“目标”? - BlueChippy
看看Moq或等效的模拟框架。它可以设置IFileImporter的模拟对象,您可以使用它来指定所需的行为(返回True或False,抛出异常等),并断言它是否已被调用。 - Steve Py
3个回答

2
简而言之,是的。我能想到很多测试方法。
您的测试确保通过模拟您在构造函数中传递的IFileImporters来调用所有导入程序。最少要断言在构造函数中传递的参数是否被方法实际使用。
一项测试应该确保如果任何导入程序引发异常,您的类会按照预期表现。
一个测试应该断言列表为空时的行为(默认为True返回?)。
还应该有一个测试,以确保如果一个或多个导入程序失败,您期望的行为是什么。(您的RunImporters结果是and-ing还是or-ing导入程序结果?)
这个方法是否运行每个导入程序,无论前一个是否失败,或者在第一个失败时返回false?
构造函数或断言也应该有一个测试,以确保当提供一个空列表时的行为。

2

1

你的方法返回bool,这是你开始的地方,例如:

  • 当没有导入程序时会发生什么?例如:Run_ReturnsFalse_WhenThereIsNoImporters
  • 其中一个导入程序出现故障(或抛出异常)会发生什么?例如:Run_ReturnsFalse_WhenAtLeastOneImporterFails
  • 什么表示成功(我想是返回true)?例如:Run_ReturnsTrue_WhenAllImportersSucceed

你设置模拟对象来模拟每种情况并针对其进行测试。当真正没有可观察到的影响(如返回值)时,您将通过验证在模拟对象上进行的调用来完成。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接