2011-09-06 6 views
2

저는 AutoFixture를 사용하여 단위 테스트에 Html 도우미를 시도하고 있습니다. 아래는 내 SUT입니다단위 자동 완성을 사용하여 HTML 도우미를 테스트하십시오.

위에서 볼 수 있듯이 테이블 태그와 ID가 첨부 된 MVC HTML 문자열 만 반환됩니다. AutoFixture와

단위 테스트를 (예는 단위 테스트 결과 아래 참조) :

[Fact] 
public void SampleTableHtmlHelper_WhenKeyExistWithinHttpContext_ReturnsExpectedHtml() 
{ 
    var fixture = new Fixture(); 

    //Arrange 
    fixture.Inject<HttpContextBase>(new FakeHttpContext()); 
    var httpContext = fixture.CreateAnonymous<HttpContextBase>(); 
    fixture.Inject<ViewContext>(new ViewContext()); 
    var vc = fixture.CreateAnonymous<ViewContext>(); 

    vc.HttpContext = httpContext; 
    vc.HttpContext.Items.Add(Keys.SomeKey, "foo"); 

    fixture.Inject<IViewDataContainer>(new FakeViewDataContainer()); 
    var htmlHelper = fixture.CreateAnonymous<HtmlHelper>(); 
    var sampleModel = fixture.CreateAnonymous<SampleModel>(); 

    //Act 
    var result = SampleHelpers.SampleTable(htmlHelper, sampleModel, null).ToString(); 

    //Assert 
    Assert.Equal("<table id=\"foo\"></table>", result); 
}  

이 FakeHttpContext 및 FakeViewDataContainer는 HttpContextBase 및 IViewDataContainer 단지 가짜 구현입니다.

이 테스트는 예상 결과를 전달하여 반환합니다. 그러나 여기서는 Autofixture를 올바르게 사용하고 있는지 잘 모르겠습니다. 이 Unit Test 내에서 AutoFixture를 사용하는 더 좋은 방법이 있습니까?

답변

5

위의 테스트가 어떻게 더 감소 될 수 있는지는 부분적인 정보를 바탕으로 정확하게 표현하기는 어렵지만, 줄일 수 있다고 생각합니다.

우선, Inject 다음에 CreateAnonymous을 부르는 콤보는 다소 관용적입니다. 특히 시퀀스를 뒤집을 경우 더욱 그렇습니다. 이것은 Freezing이라는 익명 값입니다 (DI 컨테이너의 Singleton 수명 범위와 동일합니다). 그것은 다음과 같이 더 간결하게 진술 할 수 있습니다 테스트 매핑으로 HttpContext는 FakeHttpContext에 인 것처럼

var vc = fixture.Freeze<ViewContext>(); 

또한 같다. Mapping can be done a little bit easier,하지만 과도 인스턴스를 매핑합니다.

어떤 경우에도 Manual Mocks instead of a dynamic Mock library을 사용해야하는 강력한 이유가 없으면 AutoFixture as an auto-mocking container을 사용할 수도 있습니다. 그 타입 맵핑을 많이 없앨 수 있습니다. 모든 주어진 그래서

, 나는 당신이 이런 일에 시험을 절감 할 수있을 것 추측 거라고 :

[Fact] 
public void SampleTableHtmlHelper_WhenKeyExistWithinHttpContext_ReturnsExpectedHtml() 
{ 
    var fixture = new Fixture().Customize(new AutoMoqCustomization()); 

    //Arrange 
    var vc = fixture.Freeze<ViewContext>(); 
    vc.HttpContext.Items.Add(Keys.SomeKey, "foo"); 

    var htmlHelper = fixture.CreateAnonymous<HtmlHelper>(); 
    var sampleModel = fixture.CreateAnonymous<SampleModel>(); 

    //Act 
    var result = SampleHelpers.SampleTable(htmlHelper, sampleModel, null).ToString(); 

    //Assert 
    Assert.Equal("<table id=\"foo\"></table>", result); 
} 

그러나, 일부 정렬의 대부분이 지금은 순수하게 선언입니다, 그리고 이미 xUnit.net를 사용하는 것 때문에, 당신은 메소드 인수에 변수의 대부분을 이동 AutoData Theories for AutoFixture를 사용할 수 있습니다

[Theory, AutoMoqData] 
public void SampleTableHtmlHelper_WhenKeyExistWithinHttpContext_ReturnsExpectedHtml(
    [Frozen]ViewContext vc, 
    HtmlHelper htmlHelper, 
    SampleModel sampleModel) 
{ 
    //Arrange 
    vc.HttpContext.Items.Add(Keys.SomeKey, "foo"); 

    //Act 
    var result = SampleHelpers.SampleTable(htmlHelper, sampleModel, null).ToString(); 

    //Assert 
    Assert.Equal("<table id=\"foo\"></table>", result); 
} 

이것은 당신이 AutoDataAttribute 사장님과 AutoMoqCustomization 브리지했다고 가정 예 :

public class AutoMoqDataAttribute : AutoDataAttribute 
{ 
    public AutoMoqDataAttribute : 
     base(new Fixture().Customize(new AutoMoqCustomization())) 
    { } 
} 

위의 코드를 약간 수정하여 API 세부 정보에 맞게 조정해야 할 수 있습니다. 이것은 스케치로만 의미가 있습니다.

+0

아주 좋습니다. Mark 대단히 감사합니다. – Spock

관련 문제