2010-11-03 4 views
2

Можно ли это сделать? Вот метод я тестирую:Как я могу протестировать метод, содержащий статический метод?

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

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

+5

Возможный дубликат [Mocking Static methods with Rhino.Mocks] (http://stackoverflow.com/questions/540239/mocking-static-methods-using-rhino-mocks) –

ответ

3

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

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

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

2

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

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

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

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

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

Смежные вопросы