【问题标题】:Unit/Integration testing FTP access单元/集成测试 FTP 访问
【发布时间】:2011-09-12 07:36:12
【问题描述】:

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

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

编辑:

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

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

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

【问题讨论】:

    标签: c# testing ftp


    【解决方案1】:

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

    尤其是这些类型的依赖项应该从您的正常代码中抽象出来,以防止与难以模拟的东西(例如 FTP 或邮件服务器)紧密耦合。

    我不想使用 nDumpster 之类的工具,而是希望通过良好的设计交换实现。

    【讨论】:

      【解决方案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 基础设施分离,您的测试不依赖于硬件(网络连接)。

      【讨论】:

      • 我们已经使用接口来注入一个简单的 FTP 实现,我们想要做的是能够通过我们可以运行一些集成测试的代码来启动一个 ftp 服务器。
      • 好的,所以 UnitTesting 没有任何内容。恕我直言,您应该简单地设置您的 FTP 服务器(IIS、Filezilla 等)(可能在 Build 机器上)并对其进行测试。
      【解决方案3】:

      我只是需要类似的东西,最终得到了基于小型 FTPDMIN 命令行 FTP 服务器的解决方案。你可以在这里找到我的解决方案:https://github.com/Buthrakaur/FtpIntegrationTesting

      【讨论】:

        【解决方案4】:

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

        可以在using Rebex blog找到一个小的指南

        它不是免费的,我不以任何方式附属。

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-05-05
          • 1970-01-01
          • 2020-10-26
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多