单元/集成测试FTP访问

时间:2011-06-10 08:06:55

标签: c# testing ftp

我的团队成员正在编写一个访问外部FTP站点以下载文件的应用程序。编写代码后,我们希望能够在不使用物理ftp服务器的情况下进行集成测试,因为它是一个外部站点。

我们过去使用nDumpster在代码中模拟smtp服务器做了类似的事情,我们想知道 是否有可以使用的兼容的ftp服务器?

编辑:

我应该补充一点,这些不是真正的单元测试,我们有那些并模拟我们的ftp实现。

但是我们在实际的接口实现中使用了WebFtpRequest.Create()。因此,测试此代码需要一个实际的服务器(除非我们在测试中注册我们自己的协议),最终我们将不得不针对实际的服务器进行测试!

我们希望能够在代码中启动和停止ftp服务器(就像你可以使用nDumpster一样)并检查我们的调用是否正确。

4 个答案:

答案 0 :(得分:6)

我只需要类似的东西,最后得到基于小FTPDMIN命令行FTP服务器的解决方案。您可以在此处找到我的解决方案:https://github.com/Buthrakaur/FtpIntegrationTesting

答案 1 :(得分:3)

您应该使用FTP服务器抽象代码的界面。如果您有此接口,则可以创建FTP通信的存根实现,使您的测试代码不依赖于特定的FTP服务器,并提高测试的性能。

特别是这些依赖项应该从普通代码中抽象出来,以防止与难以模拟的东西紧密耦合(例如FTP或邮件服务器)。

我不想使用像nDumpster这样的工具,而是交换通过良好设计实现的实现。

答案 2 :(得分:2)

你应该像这样介绍FtpService类的接口:

interface IFtpService
{
    byte[] Download(string fileName);
    bool Upload(byte[] data);
}

实施此界面:

public class FtpService: IFtpService
{
    //public byte[] Donload implementation goes here
    //public bool Upload(byte[] data) implementation goes here

}

在你的单元测试中,你应该使用Mocks来模拟IFtpService并使用它:创建你的期望,创建对常见Ftp异常的期望等。

这使您可以与真正的FTP基础架构分离,您的测试不依赖于硬件(网络连接)。

答案 3 :(得分:1)

您可以在项目或单元测试中包含Rebex FileServer,它在许多平台上都受支持,包括.NET

可以在using Rebex blog

找到一个小指南

它不是免费的,我不以任何方式加入。

编辑:我后来发现了this令人愉快的“糟糕的人”FTP服务器",其中包含源代码(MIT许可证)。