C# Mock System.Net.FtpClient GetHash方法

C# Mock System.Net.FtpClient GetHash方法,c#,.net,unit-testing,mocking,moq,C#,.net,Unit Testing,Mocking,Moq,是否可以模拟类System.Net.FtpClient.IFtpClient的public FtpHash GetHash(字符串路径) 问题是FtpHash有一个内部构造函数。有办法嘲笑它吗 编辑 作为模拟的一部分,我想测试所有的方法代码行 public bool Verify(string localFile, string removeFile) { bool res = false; using (IFtpClient client = n

是否可以模拟类
System.Net.FtpClient.IFtpClient的
public FtpHash GetHash(字符串路径)

问题是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应该能够返回true/false。

是的,您可以模拟接口
IFtpClient
和方法
FtpHash GetHash(字符串路径)
,但您必须使用反射:

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);
var-ctor=typeof(FtpHash)
.GetConstructors(BindingFlags.Instance | BindingFlags.NonPublic)[0];
var ftphash=(ftphash)ctor.Invoke(新对象[]{});
var fakeFtpClient=new Mock();
fakeFtpClient.Setup(x=>x.GetHash(It.IsAny()).Return(ftpHash);
编辑:

根据您提供的代码,您根本不能使用moq。 您必须进行一些重构才能使用它…(代码与
FtpClient
耦合)

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

m_算法
(FtpHash的私有成员
)的状态为
FtpHashAlgorithm。无
…()

此成员的setter是内部的,因此您必须再次使用reflation,然后使用
deployitemattribute
将哈希文件部署到
localFile
的位置

在我看来,在这种情况下,你根本不应该使用moq(UT不会小、可读、可维护和快速,除非你包装类…)。我建议你使用代码编织工具,如MsFakes/TypemMock ISolator。然后任何事情都会简单得多…(当我在.Net世界时,我使用MsFakes和rhino mocks/moq…)

下表可能会帮助您制定解决方案策略:


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

谢谢。但随后函数调用Verify(string file)并引发异常:(@AmirKatz听起来很奇怪…你面临什么异常?我必须查看你的UT和测试中的方法才能指出异常原因…(请添加它们)