我使用 Visual Studio 2008 Professional 自动化测试。我有一个写入文件的函数。我想对文件写入功能进行单元测试。我在某处读到我必须以某种方式模拟文件。我不知道该怎么做。你能帮我吗?
如何对从 Internet 下载页面的方法进行单元测试?
4 回答
如果该方法必须自己打开文件流,那么这很难模拟。但是,如果您可以将流传递给方法,并使其写入该方法,那么您可以传入 MemoryStream 代替。另一种重载可以采用更少的参数,打开文件并将 FileStream 传递给另一个方法。
这样您就不会获得完整的覆盖率(除非您编写一两个测试确实会影响磁盘),但您的大部分逻辑都在经过全面测试的代码中,在采用 Stream 参数的方法中。
这取决于您的代码与具体细节的接近程度;例如,您可以改为在Stream
s 中工作,并将 a 传递MemoryStream
给代码(并检查内容)。您可以只写入文件系统(在临时区域中),检查内容并在之后放弃它。如果您的代码略高于文件系统,您可以IFileSystem
使用您需要的高级方法(如WriteAllBytes
/ WriteAllText
)编写一个可模拟的接口。不过,模拟流式 API 会很痛苦。
对于从互联网下载(或假装)......您可以(例如)编写一个IWebClient
包含您需要的功能(如DownloadString
等)的界面;模拟它以返回固定内容,并使用类似的东西WebClient
作为实际实现的基础。当然,您需要针对真实站点测试实际实现。
如果您的测试目标是测试文件是否实际创建,则它是集成测试,而不是单元测试。
如果目标是测试是否将正确的内容写入文件,则将文件访问隐藏在接口后面,并提供内存实现。
网页访问也是如此。
interface IFileService
{
Stream CreateFile(string filename);
}
class InMemoryFileService : IFileService
{
private Dictionary<string, MemoryStream> files = new Dictionary<string, MemoryStream>();
public Stream CreateFile(string filename)
{
MemoryStream stream = new MemoryStream();
files.Add(filename, stream);
return stream;
}
public MemoryStream GetFile(string filename)
{
return files[filename];
}
}
使用 GetFile,您可以找到应该写入磁盘的内容。
您实际上并不想调用直接在函数中写入文件,而是将文件 I/O 包装在具有接口的类中。
然后,您可以使用 Rhino Mocks 之类的东西来创建一个实现接口的模拟类。