2016-05-22 3 views
0

В методе я обычно делать что-то вроде этого:C# SystemWrapper макет File.ReadAllLines

string[] lines = File.ReadAllLines(filename); 

Чтобы проверить, я хотел бы иметь возможность издеваться из файловой системы, и я слышал положительные отзывы около SystemWrapper, поэтому я хотел бы использовать эту библиотеку.

Как я понимаю, использование SystemWrapper требует, чтобы я выполнял вызов на основе интерфейса. Хорошо. Так что мой выше строка кода будет:

string[] lines = new FileWrap().ReadAllLines(filename); 

Теперь, мой тестовый метод выглядит следующим образом: (я использую Microsoft.VisualStudio.TestTools.UnitTesting в сочетании с Rhino Mock)

[TestMethod()] 
public void Test_this_method() 
{ 
    IFileWrap fileWrapRepository = MockRepository.GenerateMock<IFileWrap>(); 
    fileWrapRepository.expect(x => x.ReadAllLines("abc.txt").Return(new string[] {"Line 1", "Line 2", "Line 3"}); 

    MethodThatReadsLines(); 
} 

Этот пример приведена в примере на странице SystemWrapper Начало работы.

Однако, когда я это делаю, метод не вызывает мой издеваемый метод, он вызывает File.ReadAllLines, чего я не ожидаю.

Каков правильный способ издеваться File.ReadAllLines?

ответ

3

Moq's - это тестовые двойники, поскольку притворный вызов вы должны вызывать метод на макет, а не на какой-либо другой объект.

Вместо того, чтобы делать это в коде:

string[] lines = new FileWrap().ReadAllLines(filename); 

Вам нужно сделать что-то вроде этого:

public void MethodThatReadsLines(IFileWrap fileReader) { 
    string[] lines = fileReader.ReadAllLines(filename); 
} 

Таким образом, вы можете вводить фиктивный объект от вас проверить и используется ваш производственный код, а не только что созданный экземпляр, который вы используете сейчас:

[TestMethod()] 
public void Test_this_method() 
{ 
    IFileWrap fileWrapRepository = MockRepository.GenerateMock<IFileWrap>(); 
    fileWrapRepository.expect(x => x.ReadAllLines("abc.txt").Return(new string[] {"Line 1", 
                     "Line 2", "Line 3"}); 

    MethodThatReadsLines(fileWrapRepository.Object); 
} 
Смежные вопросы