模拟 System.Net.FtpClient GetHash 方法

Mock System.Net.FtpClient GetHash method

是否可以模拟 class 的 public FtpHash GetHash(string path) System.Net.FtpClient.IFtpClient

问题是 FtpHash 有一个内部构造函数。有没有办法模拟它?

编辑

作为模拟的一部分,我想测试所有方法代码行

    public bool Verify(string localFile, string removeFile)
    {
        bool res = false;
        using (IFtpClient client = new FtpClient())
        {
            var hash = client.GetHash(removeFile);
            if (hash != null)
            {
                if (hash.Verify(localFile))
                {
                    this.logger.Info("file pass Verify test");
                    res = true;
                }
                else
                {
                    this.logger.Error("file fail Verify test");
                }
            }
        }
        return res;
    }

因此hash.Verify应该可以returntrue/false.

是的,您也可以模拟接口 IFtpClient 和方法 FtpHash GetHash(string path),但您必须使用反射:

var ctor = typeof(FtpHash)
                 .GetConstructors(BindingFlags.Instance | BindingFlags.NonPublic)[0];
var ftphash = (FtpHash) ctor.Invoke(new object[]{ });

var fakeFtpClient = new Mock<IFtpClient>();
fakeFtpClient.Setup( x => x.GetHash(It.IsAny<string>()).Return(ftpHash);

编辑:

根据您提供的代码,您根本无法使用最小起订量。 您必须进行一些重构才能使用它...(代码耦合到 FtpClient

hash.Verify 异常的原因很简单:

m_algorithmFtpHash 的私有成员)的状态是 FtpHashAlgorithm.NONE...(here is the source code)

该成员的 setter 是内部成员,因此您必须再次使用反射,然后使用 deployitemattributte 将散列文件部署到 localFile 的位置。

IMO 在这种情况下你根本不应该使用最小起订量(UT 不会很小、可读、可维护和快速,除非你包装 类...)。我为您提供代码编织工具,例如 MsFakes/TypemMock ISolator。然后一切都会简单得多..(当我在.Net 世界时,我使用 MsFakes 和犀牛 mocks/moq...)。

下表可能对您的解决策略有所帮助:

顺便说一句,代码看起来像是代码永远不会得到任何更改的情况之一......我根本不会 UT 它......我只是觉得我在浪费时间......