2010-11-22 24 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; 
} 

所以问题是,至少在我看来,是我嘲笑功能不返回字符串的内容它应该返回。 Assert.AreEqual测试失败,因为实际为空。你们中的任何人都知道为什么实际为空?

在此先感谢。

回答

6

看来问题是您呼叫尚未建立,并且也似乎是在考验你的方法Mock<T>'s CreateNewsLetter方法。你不应该对你的假货进行测试,他们应该取代生产代码来协助测试其他代码。

在这种情况下,我建议您使用extract and override pattern,因为您希望在具有待测试方法的同一类的方法中导致伪造实现。

起订量是在某些情况下,伟大的,但我不认为这有什么不妥,当情况需要的时候使用小可读存根。

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 2010-11-22 12:55:53