2010-11-22 4 views
4

У меня есть метод в службе, которую я хочу проверить. Этот метод вызывает другой метод в том же классе. Этот метод уже протестирован, поэтому я хочу издеваться над этим методом.Издевательский метод в том же интерфейсе с MOQ

Это моя установка:

private readonly Mock<INewsLetterRepository> _mockNewsLetterRepository; 
private readonly Mock<INewsLetterService> _mockNewsLetterService; 
private readonly INewsLetterService _newsLetterService; 

public NewsLetterServiceTest() 
{ 
    _mockNewsLetterRepository = new Mock<INewsLetterRepository>(); 
    _mockNewsLetterService = new Mock<INewsLetterService> {CallBase = true}; 
    _newsLetterService = new NewsLetterService(_mockNewsLetterRepository.Object); 
} 

И это испытание я использую:

Теперь проблема заключается в том, что функция Я насмешливо: BuildNewsLetterHTML возвращает нуль, а не содержание он должен был вернуться.

Вот упрощенная версия функции Я хочу, чтобы тест:

public string CreateNewsLetter(NewsLetter newsLetter) 
{ 
    var newsletterHTML = BuildNewsLetterHTML(newsLetter); 
    return newsletterHTML; 
} 

Таким образом, проблема в том, что, по крайней мере, как я вижу, что функция I издеваться не возвращает строку содержимого он должен был вернуться. Тест завершается с ошибкой на Assert.AreEqual, потому что фактическое значение null. У любого из вас есть идея, почему фактическое значение null?

Заранее спасибо.

ответ

6

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

Я предлагаю вам использовать extract and override pattern в этом случае, так как вы хотите вызвать поддельную реализацию в методе того же класса, который имеет тестируемый метод.

Moq замечательный в некоторых случаях, но я не думаю, что есть что-то неправильное в использовании маленького читаемого заглушки, когда ситуация требует его.

public class YourTestClass 
{ 
    [TestMethod] 
    public void CreateNewsLetter_Should_Return_Empty_NewsLetter() 
    { 
     var template = new Template 
     { 
      PlaceHolders = new List<TemplatePlaceholder>() 
     }; 
     var newsLetter = new NewsLetter { Template = template }; 

     const string content = "<html><body><!--BROWSER--></body></html>"; 

     INewsletterService service = new BuildNewsLetterStub(content); 
     string actual = service.CreateNewsLetter(newsLetter); 

     Assert.AreEqual(content, actual); 
    } 
} 


public class BuildNewsLetterStub : NewsLetterService 
{ 
    private string _letter; 

    public BuildNewsLetterStub(string letter) 
    { 
     _letter = letter; 
    } 
    public override string BuildNewsLetterHTML(NewsLetter newsLetter) 
    { 
     return _letter; 
    } 
} 

Чтобы переопределить BuildNewsLetterHTML, он должен быть помечен как виртуальный.

+0

Благодарим вас за ответ. Я попробовал ваш метод, и он работает как шарм! – Gerard

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