如何单元测试将fileName作为参数的方法

时间:2012-03-28 04:51:17

标签: c# unit-testing c#-4.0 c#-3.0

我有以下方法:

public static IEnumerable<Customer> GetStuff(string fileName,int filterValue)

你将如何对此进行单元测试?显然,我的问题在于fileName参数。

谢谢!

3 个答案:

答案 0 :(得分:2)

进行另一次回答尝试:我猜theJollySin遇到问题但没解释得足够(恕我直言)

您似乎接受了fileName并点击了GetStuff方法中的系统文件系统。如果你想对它进行单元测试,那就是问题所在。 你必须将你用文件系统做的事情(打开/创建/读取文件等)推送到界面或其他东西然后嘲笑它。 一个例子可能是:

public interface IMyFileIO
{
    public byte[] ReadFromFile(int bytes); // whatever
}

public static IEnumerable<Customer> GetStuff(IMyFileIO file, int filterValue)
{
}

然后使用模拟框架(例如MOQ)来模拟IMyFileIO

[Test]
public void TestFileIO()
{
   var mock = new Mock<IMyFileIO>();
   mock.Setup(foo => foo.ReadFromFile(2)).Returns(new byte[]{2,3});

   var myResult = MyClass.GetStuff(mock.Object, 10);
   Assert. // <- what you need to check
}

请注意,根据您的工作情况,很可能已经有一个interace / base-class提供您需要的功能(StreamWriter,无论如何)

答案 1 :(得分:2)

我个人会将方法更改为更通用的方法,如

public static IEnumerable<Customer> GetStuff(Stream dataStream,int filterValue)

这将使您能够使用模拟流或MemoryStream而不是FileStream来获取数据并对其进行单元测试。此外,我个人建议尽可能使方法尽可能通用(Stream vs. filePath就是一个很好的例子)。

答案 2 :(得分:0)

我假设问题是该方法转到文件系统来获取文件? 我作为测试的前提条件实际上为您的方法创建了一个文件...然后您可以将新创建​​的文件名传递给您的测试。 它在那时成为集成测试,但它仍然适用于测试目的。这不是一个“纯粹的”单元测试