2015-01-29 3 views
5

Unterstützt xunit.net "parametrisierte Test Fixtures" wie nunit (siehe Beispielcode unten). Hinweis Ich bin nicht suchen IUseFixture<T> oder [Theory], weil diese nicht bieten die gleiche Funktionalität wie Parameterized Test FixturesGibt es parametrisierte Test Fixtures für xunit?

[TestFixture("hello", "hello", "goodbye")] 
[TestFixture("zip", "zip")] 
[TestFixture(42, 42, 99)] 
public class ParameterizedTestFixture 
{ 
    private string eq1; 
    private string eq2; 
    private string neq; 

    public ParameterizedTestFixture(string eq1, string eq2, string neq) 
    { 
     this.eq1 = eq1; 
     this.eq2 = eq2; 
     this.neq = neq; 
    } 

    public ParameterizedTestFixture(string eq1, string eq2) 
     : this(eq1, eq2, null) { } 

    public ParameterizedTestFixture(int eq1, int eq2, int neq) 
    { 
     this.eq1 = eq1.ToString(); 
     this.eq2 = eq2.ToString(); 
     this.neq = neq.ToString(); 
    } 

    [Test] 
    public void TestEquality() 
    { 
     Assert.AreEqual(eq1, eq2); 
     if (eq1 != null && eq2 != null) 
      Assert.AreEqual(eq1.GetHashCode(), eq2.GetHashCode()); 
    } 

    [Test] 
    public void TestInequality() 
    { 
     Assert.AreNotEqual(eq1, neq); 
     if (eq1 != null && neq != null) 
      Assert.AreNotEqual(eq1.GetHashCode(), neq.GetHashCode()); 
    } 
} 
+0

Große Frage. Leider habe ich auch die gleiche Frage. –

Antwort

1

Ich schaute auf den Wechsel von NUnit zu xUnit und wurde anfangs von dieser SO-Frage in die Irre geführt, dass xUnit nichts direkt mit parametrisierten Test-Fixtures tun konnte.

Aber es kann - mit [Theory]! Siehe Update unten: xUnit-Theorien sind nicht wie NUnit-Theorien, und sind tatsächlich viel mehr wie NUnit parametrisierte Tests! (Beachten Sie deshalb, ein erklärtes Annahme in der Frage falsch ist, und ich denke, dass dies die beste Antwort ist, die gegeben werden können, wenn man die falsche Annahme entfernt.)

hier eine leicht Refactoring xUnit Version der ist Code, der die gleichen sechs Tests tut:

public class ParameterizedTestFixture 
{ 
    public static IEnumerable<object[]> TestCases = new[] { 
     new object[] { "hello", "hello", "goodbye" }, 
     new object[] { "zip", "zip", null }, 
     new object[] { "42", "42", "99" } 
    }; 

    [Theory] 
    [MemberData(nameof(TestCases))] 
    public void TestEquality(string eq1, string eq2, string neq) 
    { 
     Assert.Equal(eq1, eq2); 
     if(eq1 != null && eq2 != null) 
      Assert.Equal(eq1.GetHashCode(), eq2.GetHashCode()); 
    } 

    [Theory] 
    [MemberData(nameof(TestCases))] 
    public void TestInequality(string eq1, string eq2, string neq) 
    { 
     Assert.NotEqual(eq1, neq); 
     if(eq1 != null && neq != null) 
      Assert.NotEqual(eq1.GetHashCode(), neq.GetHashCode()); 
    } 
} 

Oder, falls Sie es brauchen, ist dieses etwas komplexeren Code die gleichen sechs Tests von genau den gleichen Daten wie in der ursprünglichen Frage getrieben hat:

public class ParameterizedTestFixture 
{ 
    public static IEnumerable<object[]> TestCases = new[] { 
     new object[] { "hello", "hello", "goodbye" }, 
     new object[] { "zip", "zip", null }, 
     new object[] { 42, 42, 99 } 
    }; 

    private string eq1; 
    private string eq2; 
    private string neq; 

    public void Init(object _eq1, object _eq2, object _neq) 
    { 
     this.eq1 = (_eq1 == null ? null : _eq1.ToString()); 
     this.eq2 = (_eq2 == null ? null : _eq2.ToString()); 
     this.neq = (_neq == null ? null : _neq.ToString()); 
    } 

    [Theory] 
    [MemberData(nameof(TestCases))] 
    public void TestEquality(object _eq1, object _eq2, object _neq) 
    { 
     Init(_eq1, _eq2, _neq); 
     Assert.Equal(eq1, eq2); 
     if(eq1 != null && eq2 != null) 
      Assert.Equal(eq1.GetHashCode(), eq2.GetHashCode()); 
    } 

    [Theory] 
    [MemberData(nameof(TestCases))] 
    public void TestInequality(object _eq1, object _eq2, object _neq) 
    { 
     Init(_eq1, _eq2, _neq); 
     Assert.NotEqual(eq1, neq); 
     if(eq1 != null && neq != null) 
      Assert.NotEqual(eq1.GetHashCode(), neq.GetHashCode()); 
    } 
} 

Siehe this reference. Beachten Sie jedoch, dass PropertyDataAttribute jetzt zugunsten von MemberDataAttribute veraltet ist.

* Update *

Eine mögliche Quelle für erhebliche Verwirrung hier ist, dass es auch ein [TheoryAttribute] in NUnit ist, aber es hat unterschiedliche Bedeutung aus dem gleichen genannten Attribute in xUnit. Jeder Untertest in einer NUnit-Theorie wird zu einem Test kombiniert, der besteht oder nicht bestanden wird (also kann er nicht verwendet werden, um eine ähnliche Semantik zu einer NUnit-parametrisierten Testvorrichtung zu erreichen). Aber jeder "Sub-Test" in einer xUnit-Theorie erscheint im Runner als separater Test, d. H. Er multipliziert die Anzahl der Tests, sehr ähnlich wie bei parametrisierten NUnit-Tests!