模拟 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_algorithm
(FtpHash
的私有成员)的状态是 FtpHashAlgorithm.NONE
...(here is the source code)
该成员的 setter 是内部成员,因此您必须再次使用反射,然后使用 deployitemattributte
将散列文件部署到 localFile
的位置。
IMO 在这种情况下你根本不应该使用最小起订量(UT 不会很小、可读、可维护和快速,除非你包装 类...)。我为您提供代码编织工具,例如 MsFakes/TypemMock ISolator。然后一切都会简单得多..(当我在.Net 世界时,我使用 MsFakes 和犀牛 mocks/moq...)。
下表可能对您的解决策略有所帮助:
顺便说一句,代码看起来像是代码永远不会得到任何更改的情况之一......我根本不会 UT 它......我只是觉得我在浪费时间......
是否可以模拟 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_algorithm
(FtpHash
的私有成员)的状态是 FtpHashAlgorithm.NONE
...(here is the source code)
该成员的 setter 是内部成员,因此您必须再次使用反射,然后使用 deployitemattributte
将散列文件部署到 localFile
的位置。
IMO 在这种情况下你根本不应该使用最小起订量(UT 不会很小、可读、可维护和快速,除非你包装 类...)。我为您提供代码编织工具,例如 MsFakes/TypemMock ISolator。然后一切都会简单得多..(当我在.Net 世界时,我使用 MsFakes 和犀牛 mocks/moq...)。
下表可能对您的解决策略有所帮助:
顺便说一句,代码看起来像是代码永远不会得到任何更改的情况之一......我根本不会 UT 它......我只是觉得我在浪费时间......