如何使用 MOQ 框架模拟 c# 中的静态方法? [英] How to mock static methods in c# using MOQ framework?

查看:53
本文介绍了如何使用 MOQ 框架模拟 c# 中的静态方法?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我最近一直在进行单元测试,并且使用 MOQ 框架和 MS 测试成功地模拟了各种场景.我知道我们不能测试私有方法,但我想知道我们是否可以使用 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.

推荐答案

Moq(和其他 基于 DynamicProxy 的模拟框架)无法模拟任何非虚拟或抽象方法.

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;
    }
}

与其尝试模拟 FileUtil.ReadDataFromFile,您可以将它包装在一个 protected virtual 方法中,如下所示:

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# 中的静态方法?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆