问题描述
我最近一直在做单元测试,我已经使用 MOQ 框架和 MS Test 成功地模拟了各种场景.我知道我们无法测试私有方法,但我想知道我们是否可以使用 MOQ 模拟静态方法.
I have been doing unit testing recently and I've successfully mocked various scenarios using MOQ framework and MS Test. I know we can't test private methods but I want to know if we can mock static methods using MOQ.
推荐答案
起订量(和其他DynamicProxy-based 模拟框架)无法模拟任何不是虚拟或抽象方法的东西.
Moq (and other DynamicProxy-based mocking frameworks) are unable to mock anything that is not a virtual or abstract method.
只能使用基于 Profiler API 的工具来伪造密封/静态类/方法,例如 Typemock(商业)或 Microsoft Moles(免费,在 Visual Studio 2012 Ultimate 中称为 Fakes/2013/2015).
Sealed/static classes/methods can only be faked with Profiler API based tools, like Typemock (commercial) or Microsoft Moles (free, known as Fakes in Visual Studio 2012 Ultimate /2013 /2015).
或者,您可以重构您的设计以抽象调用静态方法,并通过依赖注入将此抽象提供给您的类.那么您不仅会有更好的设计,而且还可以使用免费工具(例如 Moq)进行测试.
Alternatively, you could refactor your design to abstract calls to static methods, and provide this abstraction to your class via dependency injection. Then you'd not only have a better design, it will be testable with free tools, like Moq.
无需完全使用任何工具即可应用允许可测试性的通用模式.考虑以下方法:
A common pattern to allow testability can be applied without using any tools altogether. Consider the following method:
public class MyClass
{
public string[] GetMyData(string fileName)
{
string[] data = FileUtil.ReadDataFromFile(fileName);
return data;
}
}
您可以将其包装在 protected virtual 方法中,而不是尝试模拟 FileUtil.ReadDataFromFile,如下所示:
Instead of trying to mock FileUtil.ReadDataFromFile, you could wrap it in a protected virtual method, like this:
public class MyClass
{
public string[] GetMyData(string fileName)
{
string[] data = GetDataFromFile(fileName);
return data;
}
protected virtual string[] GetDataFromFile(string fileName)
{
return FileUtil.ReadDataFromFile(fileName);
}
}
然后,在您的单元测试中,从 MyClass 派生并将其命名为 TestableMyClass.然后你可以重写 GetDataFromFile 方法来返回你自己的测试数据.
Then, in your unit test, derive from MyClass and call it TestableMyClass. Then you can override the GetDataFromFile method to return your own test data.
希望对您有所帮助.
这篇关于如何使用 MOQ 框架在 c# 中模拟静态方法?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!


大气响应式网络建站服务公司织梦模板
高端大气html5设计公司网站源码
织梦dede网页模板下载素材销售下载站平台(带会员中心带筛选)
财税代理公司注册代理记账网站织梦模板(带手机端)
成人高考自考在职研究生教育机构网站源码(带手机端)
高端HTML5响应式企业集团通用类网站织梦模板(自适应手机端)