2015-08-06 12 views
7

Sono passato all'utilizzo di Xunit per i test di unità di NUnit. Con NUnit, creerei un metodo con più test case che hanno lo stesso risultato. Ad esempio, il seguente test dell'unità NUnit verifica la convalida di un costruttore di classi, in particolare della variabile "nome". Il nome non può essere nullo, vuoto o spazio vuoto. Il test controlla che un ArgumentNullException sia correttamente gettato:Qual è il modo preferito per gestire più casi di test in Xunit?

[Test] 
    [TestCase(null)] 
    [TestCase("")] 
    [TestCase("  ")] 
    [ExpectedException(typeof(ArgumentNullException))] 
    public void Constructor_InvalidName_ExceptionThrown(string name) 
    { 
     // action 
     make_Foo(name); 
    } 

    private make_Foo(string name) 
    { 
     return new Foo(name); 
    } 

Ecco come ho implementato questo utilizzando xUnit:

[Fact] 
    public void Constructor_InvalidName_ExceptionThrown() 
    { 
     Assert.Throws<ArgumentNullException>(() => new Foo(null)); 
     Assert.Throws<ArgumentNullException>(() => new Foo("")); 
     Assert.Throws<ArgumentNullException>(() => new Foo(" ")); 
    } 

Questo sembra un male per due ragioni - ho più afferma in quello che dovrebbe essere un test di "unità" e con i casi di test sepolti all'interno del metodo (che potrebbe essere molto più complicato in alcuni degli altri test di unità).

Qual è il modo migliore per gestire più casi di test in Xunit?

+1

XUnit ha un tipo chiamato "Teoria" che è possibile utilizzare. –

+0

Per un esempio dell'attributo Theory di XUnit: guarda [qui] (http://dontcodetired.com/blog/post/Creating-Inline-Data-Driven-Tests-in-xUnit.aspx) – prgmtc

risposta

9

È possibile utilizzare l'attributo Theory nello stesso senso:

[Theory()] 
[InlineData(null)] 
[InlineData("")] 
[InlineData("  ")] 
public void Constructor_InvalidName_ExceptionThrown(string name) 
{ 
    Assert.Throws<ArgumentNullException>(() => new Foo(name)); 
} 

Io non sono sicuro se xUnit ha am attributo equivalente a ExpectedException comunque. Se c'è, I would not use it.

Ci usato essere un attributo ExpectedException in xUnit ma è stato dal deprecated in favour of Assert.Throws.

Problemi correlati