2014-03-13 6 views
34

xUnit.net 및 AutoFixture를 처음 사용했습니다.사실과 이론의 차이점은 무엇입니까? - xUnit.net

저는 현재 "testproject"로 xUnit.net 및 Autofixture에 익숙해지고 있습니다. 내가 이해하지 못하는 작은 것이 하나있다.

[Fact][Theory, AutoMoqData]의 차이점은 무엇입니까?

다음 두 코드가 동일한 지 말해 줄 수 있습니까? 두 가지 모두에서 테스트가 성공하기 때문에이 질문을하고 있지만 올바른 방법을 배우고 싶습니다.

[Fact] 
public void UpdateVersionWillUpdateCorrectlyInRepository() 
{ 
    var fixture = new Fixture().Customize(new AutoMoqCustomization()); 
    var contract = fixture.Create<VersionContract>(); 
    var version = fixture.Create<Version>(); 

    fixture.Freeze<Mock<IContractMapper>>() 
     .Setup(r => r.Map(contract)).Returns(version); 

    var repMock = fixture.Freeze<Mock<VersionRepository>>(); 

    var sut = fixture.Create<VersionManagementService>(); 

    sut.UpdateVersion(contract); 

    repMock.Verify(r => r.UpdateVersion(version)); 
} 

나 차이가 있다고 생각한다 무엇
[Theory, AutoMoqData] 
public void UpdateVersionWillUpdateCorrectlyInRepository(
    VersionContract contract, 
    Version version, 
    [Frozen]Mock<IContractMapper> mapMock, 
    [Frozen]Mock<VersionRepository> repMock, 
    VersionManagementService sut) 
{ 
    mapMock.Setup(r => r.Map(contract)).Returns(version); 

    sut.UpdateVersion(contract); 

    repMock.Verify(r => r.UpdateVersion(version)); 
} 

는 키워드 [Fact][Theory] 있습니다.

[Theory] 키워드는 xUnit.net 프레임 워크에 제공된 데이터가 어딘가 어디서 왔는지, 어디에서 Autofixture인지를 알려주고 있습니다. 반면에 [Fact]은 xUnit에 데이터의 출처에 대해 아무 것도 말하지 않고 수동으로 객체를 만들어야합니다.

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

그런 다음, 이 두 시험은 동일합니다

답변

45

당신의 [AutoMoqData] 속성은 다음과 같이 보입니다 가정하면.

[Fact][Theory] 속성은 xUnit.net에 의해 정의됩니다.

[Fact] 속성은 xUnit.net 테스트 러너가 '일반적인'단위 테스트를 식별하는 데 사용합니다. 메소드 메소드 인수가없는 테스트 메소드입니다.

[Theory] 속성은 하나 이상의 DataAttribute 인스턴스가 Parameterized Test의 메소드 인수 값을 제공 할 것으로 기대합니다.

xUnit.net 자체는 DataAttribute : [InlineData], [ClassData], [PropertyData]에서 비롯된 다양한 특성을 제공합니다.

[AutoData] 특성을 제공하여 xUnit.net의이 확장 지점에 AutoFixture를 연결합니다. 테스트를 선언적으로 만드는 데 사용할 수 있습니다.

+0

설명해 주셔서 감사합니다. 예, 내 AutoMoqData-Attribute는 귀하의 것과 같습니다. BTW : .NET Book에서 "Dependency Injection"을 좋아하고 "Testproject"가 빌드됩니다! – sternze

+0

코드에서 DataAttribute를 사용하지 않아야합니까? –

+0

@ BjörnAliGöransson 아니요, AutoDataAttribute는 * AutoFixture.XUnit *에 정의되어 있습니다. * AutoFixture.XUnit2 *. –