【问题标题】:How do I unit test a method containing a static method?如何对包含静态方法的方法进行单元测试?
【发布时间】:2010-11-03 18:49:54
【问题描述】:

这可以吗?这是我正在测试的方法:

public void SaveAvatarToFileSystem()
{
  Directory.CreateDirectory(AvatarDirectory);
  _file.SaveAs(FormattedFileName);
}

在我的单元测试中,我使用的是 Rhino.Mocks,我想验证 _file.SaveAs() 是否被调用。我已经模拟了 _file(它是一个 HttpPostedFileBase 对象)并将其注入到该方法的类构造函数中。我想运行这个单元测试,但实际上并没有进行 Directory.CreateDirectory 调用。这可能吗?

【问题讨论】:

标签: c# unit-testing rhino-mocks httppostedfilebase


【解决方案1】:

It is not possible to mock a static method using Rhino Mocks.

但是,可以这样做。 Microsoft MolesTypeMock 具有此功能。

我尝试过使用 Moles,效果很好。它会为您生成一个模拟程序集,您可以在运行时将静态方法替换为委托。

【讨论】:

    【解决方案2】:

    无法使用 Rhino Mocks 模拟静态方法。我要做的是在类中的“受保护的内部虚拟”方法中隔离静态方法。然后你可以做的是模拟“被测类”并模拟“CreateAvatarDirectory”方法。然后调用“SaveAvatarToFileSystem”方法并验证代码是否调用了您模拟的“CreateAvatarDirectory”方法。

    这是一个非常方便的技巧,它允许您隔离被测类中的方法,并断言它们被同一类中的其他方法调用。希望对您有所帮助!

    public void SaveAvatarToFileSystem()
    {
        CreateAvatarDirectory();
        _file.SaveAs(FormattedFileName);
    }
    
    protected internal virtual void CreateAvatarDirectory()
    {
        Directory.CreateDirectory(AvatarDirectory);
    }
    

    【讨论】:

      【解决方案3】:

      您可以为静态类编写或使用现有的包装器(在上述情况下,System.IO.Abstractions 可能会有所帮助)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-09-06
        • 2016-06-20
        • 2017-02-16
        • 1970-01-01
        • 1970-01-01
        • 2019-05-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多