没有对矫正类A
代码你将无法使用Moq的UT方法ReadBlock
。您可以使用代码编织工具UT这种方法(MsFakes,Typemock隔离,等...)
例如(MsFakes):
[TestMethod]
public void TestMethod1()
{
using (ShimsContext.Create())
{
ShimCloudBlockBlob.AllInstances.<the method you want to override> = (<the method arguments>) => {};
}
}
里面的using
范围,你就可以通过属性AllInstances
覆盖CloudBlockBlob具有的任何方法。
在下一节中,我将讨论所有你有其他选项...
选项1:
public class A
{
private IBlockBlob _blockBlob;
public A(IBlockBlob blockBlob)
{
_blockBlob = blockBlob;
}
public void ReadBlock()
{
_blockBlob.DoSomething();
}
}
既然你创建一个新的实例每次调用ReadBlock
(你的方法的目前的行为),你最好注入一个工厂,而不是包装,DoSomething
应该是create
;选项2:
public class A
{
private readonly IFactoryBlockBlob _blobFctory;
public A(IFactoryBlockBlob blobFctory)
{
_blobFctory = blobFctory;
}
public void ReadBlock()
{
var blob = _blobFctory.Create();
}
}
然而,根据你的问题,你的意见,似乎你的类“具有相关性”而不是“需要依赖”。
(马克西门子写DI一个伟大的书,这个图表是从his book拍摄)
有了这个新资料片的方法应该是这样的;方案3:
public class A
{
public void ReadBlock(ICloudBlob blob)
{
}
}
但你并不想改变方法的签名:
public class A
{
public void ReadBlock()
{
ReadBlock(new CloudBlockBlob(<the params bla bla...>));
}
internal void ReadBlock(ICloudBlob blob)
{
}
}
添加InternalsVisibleToAttribute
,然后验证内部方法的行为。
通过阅读,我觉得你的班级是一种“遗留代码”,这意味着它可以完成这项工作,不会改变,并且验证其行为可能浪费时间。在过去,我发布了一张图表(in this answer),可以帮助您决定如何处理这种情况。
可能最好为CloudBlockBlob创建一个非常简单的可打包包装,以提高代码的可测试性并使用依赖性反转注入它。 –
问题是我是否可以在不修改项目** A **的代码的情况下做到这一点? 我知道一种选择是从外部注入ICloudBlob。 – shlatchz
好的,你没有在问题中指定.. –