2017-04-10 9 views
2

新しいプロジェクトでベストプラクティスを実装しようとすると、MVCタグヘルパーにユニットテストをどの程度まで拡張できるのか分かりました。この例では、MVC documentationのタグヘルパーセクションから取られた非常に単純なヘルパーを持っていますので、今は<email mail-to="Support"></email>です。ASP.NETコアのユニットテストタグヘルパー - タグのパブリックプロパティを埋め込む

実際のコードは以下のとおりです。予想通り

public class EmailTagHelper : TagHelper 
{ 
    private const string EmailDomain = "contoso.com"; 

    public string MailTo { get; set; } 

    public override void Process(TagHelperContext ctx, TagHelperOutput output) 
    { 
     output.TagName = "a"; 
     var addr = $"{MailTo}@{EmailDomain}"; 
     output.Attributes.SetAttribute("href", $"mailto:{addr}"); 
     output.Content.SetContent(addr); 
    } 
} 

結果のHTMLは、コードを実行するときに、私は、ブレークポイントを設定した場合、私はパスカルケースmail-toが正しくC#クラス内部キャメルケースMailToに移入されていることを見ることができます。

今、私は、次のユニットテストを持っている:

[TestMethod]   
public void EmailTagHelper_GeneratesExpectedHtml() 
{ 
    var emailHelper = new EmailTagHelper(); 

    var ctx = new TagHelperContext(new TagHelperAttributeList 
    { 
     {"mail-to", "Support"} 
    }, new Dictionary<object, object>(), Guid.NewGuid().ToString("N")); 

    var output = new TagHelperOutput("email", 
     new TagHelperAttributeList(), (useCachedResult, htmlEncoder) => 
     { 
      var tagHelperContent = new DefaultTagHelperContent(); 
      tagHelperContent.SetContent(string.Empty); 
      return Task.FromResult<TagHelperContent>(tagHelperContent); 
     }); 

    emailHelper.Process(ctx, output); 
    Assert.AreEqual("a", output.TagName); 
    Assert.AreEqual("mailto:[email protected]", output.Attributes["href"].Value); 
} 

最初のassertが通過していると私は、タグのヘルパークラス内のブレークポイント場合、私は属性が正常にアプリケーションを実行する際に渡されたものに一致していることがわかります何らかの理由でパスカルからラクダへのマッピングMailToがテスト中に発生していません。

私はGithubにあるMVC Tag Helper Unit Testsのソースコードに基づいて作業していますが、私は何か不足していると思います。

何かアドバイスや私はそう:(それは私が一望できていますちょうどニュアンスだ期待している場合、すべての正直で警官アウト答えのビットのように思われる、私のテストでemailHelper.MailToを設定する必要がありますするつもりです!

答えて

3

ルックス以下のようなあなたは、テスト対象システムのプロパティを設定しませんでした。

すなわち、このコード行を意味

emailHelper.MialTo = "Support"; 

var addr = $"{MailTo}@{EmailDomain}"; 

処理時にMailToが空白の場合は、期待される電子メールアドレスを生成しません。

実際にMailToプロパティを設定しない限り、カスタム実装ではコンテキストにアクセスするので、ユニットテストでProcessが呼び出されたときの値はありません。

フレームワークはライブコードで実行しているときにあなたのために剃刀を解釈してプロパティを設定しますが、単体テストではそうではありません。

+0

タグヘルパーが実際に走ることが許可される前に、Razorが何らかの形で関与してマッピングを行っていたことが私の疑いでした....彼らはIMOをやったのはちょっと面倒ですが、なぜ彼らがそれをやったのか分かります。私はこれがどのように起こっているのかを知る必要があるかどうかを知る必要があります。 すべて同じ、入力のおかげで!少なくとも正しい行に沿って作業していました:) –

+0

私はおそらく 'emailHelper.Init(ctx) 'を呼び出すとこれを処理できると思っていましたが、このTagHelperクラス以外では完全に処理されているようです。どういうわけか。 –

+0

@JakHammondはい、それはあなたがOPでリンクした彼らのテストを検討することをお勧めします。私は、彼らがビューのコンテキストを作成し、あなたが望むことを行うヘルパーに割り当てるかもしれないことに気付いています。このテストを確認してくださいhttps://github.com/aspnet/Mvc/blob/dev/test/Microsoft.AspNetCore.Mvc.TagHelpers.Test/TextAreaTagHelperTest.cs#L150 – Nkosi

関連する問題