我有以下方法:
public static IEnumerable<Customer> GetStuff(string fileName,int filterValue)
你将如何对此进行单元测试?显然,我的问题在于fileName
参数。
谢谢!
答案 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)
我假设问题是该方法转到文件系统来获取文件? 我作为测试的前提条件实际上为您的方法创建了一个文件...然后您可以将新创建的文件名传递给您的测试。 它在那时成为集成测试,但它仍然适用于测试目的。这不是一个“纯粹的”单元测试