c# - 如何使用 MOQ 框架在 c# 中模拟静态方法?

标签 c# unit-testing mocking moq

我最近一直在做单元测试,我已经成功地使用 MOQ 框架和 MS 测试模拟了各种场景。我知道我们无法测试私有(private)方法,但我想知道我们是否可以使用 MOQ 模拟静态方法。

最佳答案

Moq(和其他基于 DynamicProxy 的模拟框架)无法模拟任何不是虚拟或抽象方法的东西。

密封/静态类/方法只能使用基于 Profiler API 的工具伪造,例如 Typemock (商业)或 Microsoft Moles(免费,在 Visual Studio 2012 Ultimate/2013/2015 中称为 Fakes)。

或者,您可以重构您的设计以抽象调用静态方法,并通过依赖注入(inject)为您的类提供这种抽象。这样您不仅会拥有更好的设计,而且可以使用免费工具(如 Moq)对其进行测试。

可以在不使用任何工具的情况下应用允许可测试性的通用模式。考虑以下方法:

public class MyClass
{
    public string[] GetMyData(string fileName)
    {
        string[] data = FileUtil.ReadDataFromFile(fileName);
        return data;
    }
}

与其尝试模拟 FileUtil.ReadDataFromFile,不如将其包装在 protected virtual 方法中,如下所示:

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 方法以返回您自己的测试数据。

希望对您有所帮助。

关于c# - 如何使用 MOQ 框架在 c# 中模拟静态方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12580015/

相关文章:

python - 无法在 Visual Studio Code 中调试 Django 单元测试

.net - 在 Moq 回调中使用当前对象实例

c# - 模拟一个方法返回 true 仍然返回 false

c# - 如何对返回匿名对象的 ASP.NET Core MVC Controller 进行单元测试?

c# - access vba 中的 .net5 com 库

c# - 使用 ABOT 抓取站点地图

c# - 每个应用程序为静态内容生成一次 QueryString 参数

c# - 使用 Selenium 2 的 IWebDriver 与页面上的元素进行交互

Java Mockito JUnit 测试/模拟类,其构造函数包含抽象方法调用

unit-testing - 从 MSTest 迁移到 XUnit