2010-11-22 5 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ではなく、コンテンツのnullを返しますそれは戻ってくるはずです。ここで

は、私がテストしたい機能の簡易版である:

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

だから、問題は、私はそれを参照してください少なくともとして、私はモック関数は、コンテンツの文字列を返さないことである、ということですそれは戻ってくるはずです。実際はnullであるため、テストはAssert.AreEqualで失敗します。実際にnullである理由は何ですか?

ありがとうございます。

答えて

6

Mock<T>'s 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

関連する問題