Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我应该在方法没有明显返回的情况下对代码进行单元测试吗?_C#_Unit Testing_Nunit_Moq - Fatal编程技术网

C# 我应该在方法没有明显返回的情况下对代码进行单元测试吗?

C# 我应该在方法没有明显返回的情况下对代码进行单元测试吗?,c#,unit-testing,nunit,moq,C#,Unit Testing,Nunit,Moq,我有一个类,它的唯一目的是从接口在其他类上运行方法 测试类的接口没有问题,但是运行程序实际上没有做任何事情,并且(目前)传递到构造函数的唯一参数是私有的 在我的例子中,这些类将文本文件导入数据库 internal DataImporter { private List<IFileImporter> _importers; public DataImporter(List<IFileImporter> importers){ _importers = im

我有一个类,它的唯一目的是从接口在其他类上运行方法

测试类的接口没有问题,但是运行程序实际上没有做任何事情,并且(目前)传递到构造函数的唯一参数是私有的

在我的例子中,这些类将文本文件导入数据库

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.
  }
内部数据导入器
{
私人进口商名单;
公共数据导入器(列表导入器){
_进口商=进口商;
公共图书馆
{
//对于每个导入器,调用其“Run”方法-然后每个导入器都执行它需要执行的任何操作
//但是,这不需要在IFileImporter上调用特定的“Run”方法
//我有另一个应用程序,它使用IFileImporter首先检查文件的存在
//然后允许用户选择是否导入。
}
在我看来,这里似乎没有什么可测试的?我无法测试
\u importers
的值,我不想为了测试而将其公开。DataImporter特定于此实例,因此创建接口似乎没有任何好处

我在其他地方使用过IFileImporter,但这是唯一的“批量”导入器,其他导入器是从winforms应用程序手动调用的,还有一些导入器根本不在这个项目中


那么,我需要测试这个吗……关于这个我可以测试什么呢?

简而言之,是的。我可以马上想到很多测试

您的测试通过模拟您在构造函数中传递的IFileImporter来确保调用所有导入程序。它至少会断言您在构造函数中传递的内容实际上被方法使用

一种测试,用于确保如果任何导入程序引发异常,则类的行为符合预期

如果列表为空,测试应该断言该行为。(默认为True return?)

如果一个或多个导入程序失败,测试还应该断言您期望的行为。(您是否正在为您的RunImporters结果调用或调用导入程序结果?)

该方法是否运行每个导入程序,而不管前一个导入程序是否失败,还是在第一次失败时返回false


还应该对构造函数或断言进行测试,以确定其是否提供了空列表。

您可以断言已调用了这些方法。您可以参考以下问题来了解这是如何完成的:

您还可以断言在
DataImporter
类中未遇到异常


如果您对所使用的接口拥有绝对控制权,则让每个接口返回一个
布尔值
,指示特定操作是否成功可能会有所帮助。

您的方法返回
bool
,这就是您的起点,例如:

  • 当没有导入程序时会发生什么情况?例如:
    Run\u returns\u当没有导入程序时也是如此
  • 当其中一个中断(或抛出)时会发生什么情况?例如:
    Run\u returns\u leasttoneimporterfails\u
  • 什么表示成功(我想返回
    true
    )?示例:
    在所有导入成功时运行\u ReturnsTrue

您可以设置模拟来模拟这些场景中的每一个,并再次进行测试。当确实没有可观察的效果时(如返回值),您将通过验证是否对模拟对象进行了调用来完成此操作。

如果这种void方法更改了对象的状态,或进行了任何外部调用,您可能仍然希望通过测试最终结果而不是具体的返回值来测试它。@ryadavilli-我同意。现在我正在创建一个从数据库中删除对象的单元测试。该方法返回void,但我仍然可以检查它是否存在于数据库中。该对象实际上是“Main”方法,但使用强类型列表而不是参数。当前大约30个具体导入器中的每一个实际上都做了一些事情…但这个类只是运行它们的一种方式。我可以将其设置为静态,并将列表传递到Run方法中(也许我应该!),因此,添加一个“已知”测试导入器,将其添加到我的类中,检查它是否需要“一个文件”并将其导入“目的地”?查看Moq或等效的模拟框架。它可以设置IFileImporter的模拟,您可以使用该模拟来指定所需的行为(返回True或False、抛出异常等),并断言是否调用了它。