2017-04-10 8 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을 채우는 것을 볼 수 있습니다. 이제

I가 다음과 같은 단위 테스트 :

[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); 
} 

첫 번째 어설 통과 내가 태그 헬퍼 클래스 내부에 브레이크 포인트 만약 내가 속성은 일반적으로 응용 프로그램을 실행할 때 전달되는 것과 일치하는 것을 볼 수있다 , 어떤 이유로 파스칼과 낙타의 매핑을 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