Как выполнить модульное тестирование метода, содержащего статический метод? - PullRequest
2 голосов
/ 03 ноября 2010

Можно ли это сделать?Вот метод, который я тестирую:

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

В моем модульном тесте я использую Rhino.Mocks и хочу убедиться, что _file.SaveAs () был вызван.Я вычеркнул _file (который является объектом HttpPostedFileBase) и внедрил его в конструктор класса этого метода.Я хочу запустить этот модульный тест, но на самом деле не получен вызов Directory.CreateDirectory.Это возможно?

Ответы [ 3 ]

3 голосов
/ 03 ноября 2010

Невозможно смоделировать статический метод, используя Rhino Mocks .

Однако это возможно. Microsoft Moles и TypeMock имеют эту возможность.

Я пробовал использовать родинки, и все работает нормально.Он генерирует фиктивную сборку для вас, и вы можете заменить статический метод во время выполнения делегатом.

2 голосов
/ 03 ноября 2010

Нельзя издеваться над статическим методом, используя Rhino Mocks.То, что я хотел бы сделать, это изолировать статический метод в методе «защищенный внутренний виртуальный» в классе.Тогда вы можете смоделировать «тестируемый класс» и смоделировать метод «CreateAvatarDirectory».Затем вызовите метод «SaveAvatarToFileSystem» и убедитесь, что код вызвал ваш поддельный метод «CreateAvatarDirectory».

Это очень удобный трюк, позволяющий изолировать методы в тестируемом классе и утверждать, что они были вызваны другими методамив том же классе.Надеюсь, это поможет!

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

protected internal virtual void CreateAvatarDirectory()
{
    Directory.CreateDirectory(AvatarDirectory);
}
0 голосов
/ 04 ноября 2010

Вы можете написать или использовать существующую оболочку для статического класса (в приведенном выше случае может помочь System.IO.Abstractions ).

...