如何对包含静态方法的方法进行单元测试?

时间:2010-11-03 18:49:55

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

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

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

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

3 个答案:

答案 0 :(得分:3)

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

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

我尝试过使用Moles,它运作正常。它为您生成一个模拟程序集,您可以在运行时用委托替换静态方法。

答案 1 :(得分:2)

使用Rhino Mocks无法模拟静态方法。我要做的是隔离类中“protected internal virtual”方法中的静态方法。然后你可以做的是模拟“被测试的类”并模拟“CreateAvatarDirectory”方法。然后调用“SaveAvatarToFileSystem”方法并验证代码名为“CreateAvatarDirectory”方法。

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

public void SaveAvatarToFileSystem()
{
    CreateAvatarDirectory();
    _file.SaveAs(FormattedFileName);
}

protected internal virtual void CreateAvatarDirectory()
{
    Directory.CreateDirectory(AvatarDirectory);
}

答案 2 :(得分:0)

您可以为静态类编写或使用现有的包装器(在上面的例子中,System.IO.Abstractions可能有帮助)。