You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#使用Moq框架Mock FtpClient单元测试的方法及参数问题

如何用Moq Mock FtpClient连接逻辑

要Mock FtpClient 的连接操作,核心是依赖抽象而非具体实现——因为Moq仅能Mock接口、抽象类或带有虚方法的类。如果你的FtpClient是第三方库(比如FluentFTP)的具体类,需要先做一层抽象适配:

1. 定义抽象接口

先创建包含核心操作的接口:

public interface IFtpClient
{
    void Connect();
}

2. 实现适配器类(针对第三方FtpClient)

如果FtpClient是第三方库的非可Mock类,写一个适配器封装它:

public class FtpClientAdapter : IFtpClient
{
    private readonly FtpClient _innerClient;

    public FtpClientAdapter(string host, string username, string password, int port)
    {
        _innerClient = new FtpClient(host, username, password, port);
    }

    public void Connect()
    {
        _innerClient.Connect();
    }
}

如果是你自己实现的FtpClient,直接让它实现IFtpClient接口即可。

3. 编写Mock测试

现在可以用Moq Mock IFtpClient,完全跳过真实的FTP连接:

// 创建Mock实例
var mockFtp = new Mock<IFtpClient>();

// 配置Connect方法的行为(比如验证是否被调用,或模拟异常)
mockFtp.Setup(client => client.Connect()).Verifiable();

// 将Mock对象注入到被测服务中
var yourService = new YourBusinessService(mockFtp.Object);

// 执行被测方法
yourService.DoSomethingThatUsesFtp();

// 验证Connect方法是否按预期被调用
mockFtp.Verify(client => client.Connect(), Times.Once);

解决“no such host is known”连接错误

这个错误是因为使用了无效的FTP主机地址,分两种场景处理:

场景1:需要真实连接测试(非单元测试)

如果要真实连接FTP服务器,替换参数为有效配置:

  • Host:使用可访问的FTP服务器域名或IP,比如本地搭建的FTP服务器填"localhost"/"127.0.0.1",或线上服务器的真实域名/IP。
  • Username/Password:填写FTP服务器分配的合法账号密码。
  • Port:默认FTP端口是21,SFTP是22,根据服务器配置填写。

场景2:单元测试(无需真实连接)

单元测试中应该用Mock跳过真实连接,此时参数可以随便填(比如"dummy-host"、"test-user"、"test-pass"、21),因为Mock的Connect方法不会执行真实的网络操作,也就不会触发主机不存在的错误。


内容的提问来源于stack exchange,提问作者Keer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 11:22:57