gpt4 book ai didi

c# - 模拟 System.Net.FtpClient GetHash 方法

转载 作者:太空宇宙 更新时间:2023-11-03 23:23:38 24 4
gpt4 key购买 nike

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

问题是 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。

最佳答案

是的,你也可以模拟接口(interface) 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_algorithm(FtpHash 的私有(private)成员)的状态是FtpHashAlgorithm.NONE...( here is the source code )

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

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

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

enter image description here

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

关于c# - 模拟 System.Net.FtpClient GetHash 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34548163/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com