0

有人可以指导我如何为返回 Ienumerable 的方法编写测试吗?

这是我的方法-

public  IEnumerable<string> fetchFiles()
{ 
   IOWrapper ioWrapper = new IOWrapper();
   var files = ioWrapper.GetFiles(folderPath, "*.csv", SearchOption.AllDirectories);
   return files;
}

我刚刚开始学习单元测试。因此,如果有人向我解释如何去做,我将不胜感激。

4

2 回答 2

3

你需要一些测试框架。您可以使用嵌入在 Visual Studio 中的 MS 测试 - 将新的测试项目添加到您的解决方案中。或者您可以使用例如我正在使用的 NUnit。

[TestFixture] // NUnit attribute for a test class
public class MyTests
{
    [Test] // NUnit attribute for a test method
    public void fetchFilesTest() // name of a method you are testing + Test is a convention
    {
        var files = fetchFiles();

        Assert.NotNull(files); // should pass if there are any files in a directory
        Assert. ... // assert any other thing you are sure about, like if there is a particular file, or specific number of files, and so forth
    }
}

有关 NUnit 中可能的断言的完整列表,请导航至此处。还要感谢用户 xxMUROxx 指出CollectionAssert类。

另外,对于多行的测试方法,您可能希望它具有可读性,因此请在 Internet 上搜索“Arrange Act Assert (AAA) Pattern”。

还有一件事,这里已经有一个关于在 SO 上测试 IEnumerables问题。

于 2013-11-12T07:53:24.193 回答
2

为了使代码更具可测试性,注入IOWrapper作为依赖项。您可以通过在其上声明接口IOWrapper或使方法虚拟化来使其可模拟。在您的测试期间,您可以注入模拟而不是具体实例,并使您的测试成为真正的单元测试。

public class CSVFileFinder
{
    private readonly IOWrapper ioWrapper;

    private readonly string folderPath;

    public CSVFileFinder(string folderPath)
        : this(new IOWrapper(), folderPath)
    {  
    }

    public CSVFileFinder(IOWrapper ioWrapper, string folderPath)
    {
        this.ioWrapper = ioWrapper;
        this.folderPath = folderPath;
    }

    public IEnumerable<string> FetchFiles()
    {
        return this.ioWrapper.GetFiles(folderPath, "*.csv", SearchOption.AllDirectories);
    }
}

这是一个示例单元测试,它验证 的结果IOWrapper是从GetFiles. 这是使用Moq和编写的NUnit

[TestFixture]
public class FileFinderTests
{
    [Test]
    public void Given_csv_files_in_directory_when_fetchFiles_called_then_return_file_paths_success()
    {
        // arrange
        var inputPath = "inputPath"; 
        var testFilePaths = new[] { "path1", "path2" };
        var mock = new Mock<IOWrapper>();
        mock.Setup(x => x.GetFiles(inputPath, It.IsAny<string>(), It.IsAny<SearchOption>()))
            .Returns(testFilePaths).Verifiable();

        var testClass = new CSVFileFinder(mock.Object, inputPath);

        // act
        var result = testClass.FetchFiles();

        // assert
        Assert.That(result, Is.EqualTo(testFilePaths));
        mock.VerifyAll();
    }
}

然后,您可以为边缘条件添加测试,例如 IOWrapper 抛出异常或没有返回文件等。IOWrapper使用它自己的一组测试单独测试。

于 2013-11-12T09:54:22.880 回答