2013-01-02 11 views
8

Sto provando a creare un metodo che accetta un certificato di test o delegato e passa i parametri all'oggetto delegato. Questo perché sto creando un test per i metodi nei controller che prendono tutti lo stesso parametro (un id) e non voglio creare un test per tutti i metodi del controller.Passare parametri a TestDelegate in NUnit

codice che ho:

protected void AssertThrows_NullReference_Og_InvalidOperation(TestDelegate delegateMethod) 
{ 

    Assert.Throws<NullReferenceException>(delegateMethod); 
    Assert.Throws<InvalidOperationException>(delegateMethod); 
    Assert.Throws<InvalidOperationException>(delegateMethod); 
} 

Quello che vorrei fare:

protected void AssertThrows_NullReference_Og_InvalidOperation(TestDelegate delegateMethod) 
{ 

    Assert.Throws<NullReferenceException>(delegateMethod(null)); 
    Assert.Throws<InvalidOperationException>(delegateMethod(string.Empty)); 
    Assert.Throws<InvalidOperationException>(delegateMethod(" ")); 
} 

EDIT: Ho dimenticato di dire che il controllore ha un valore di ritorno. Pertanto l'azione non può essere utilizzata.

+0

Vedere la mia risposta aggiornato –

+1

Hai ragione. Ho aggiunto la mia soluzione sul fondo, che ho preso in prestito il codice e fatto alcune modifiche. Grazie per l'aiuto. –

risposta

10

Utilizzare il metodo Action<string> per passare il metodo che accetta un parametro a stringa singola. Richiamare che l'azione con i tuoi parametri di test:

protected void AssertThrowsNullReferenceOrInvalidOperation(Action<string> action) 
{ 
    Assert.Throws<NullReferenceException>(() => action(null)); 
    Assert.Throws<InvalidOperationException>(() => action(String.Empty)); 
    Assert.Throws<InvalidOperationException>(() => action(" ")); 
} 

Usage:

[Test] 
public void Test1() 
{ 
    var controller = new FooController(); 
    AssertThrowsNullReferenceOrInvalidOperation(controller.ActionName); 
} 

UPDATE:

Usa Func<string, ActionResult> per i controller che restituisce ActionResult. Inoltre è possibile creare un metodo generico per questo scopo.

1

Come detto nella modifica, il controller ha un tipo di ritorno. Pertanto, ho dovuto passare da Action a Func, e dal momento che l'ho usato in un unit test ho dovuto creare un oggetto temporaneo che detiene la funzione.

in base alla risposta del lazyberezovsky ecco il mio codice risultante:

public class BaseClass 
    { 
      protected Func<string, ActionResult> tempFunction; 
      public virtual void AssertThrowsNullReferenceOrInvalidOperation() 
      { 
       if (tempFunction != null) 
       { 
        Assert.Throws<NullReferenceException>(() => tempFunction(null)); 
        Assert.Throws<InvalidOperationException>(() => tempFunction(string.Empty)); 
        Assert.Throws<InvalidOperationException>(() => tempFunction(" ")); 
       } 
      } 
    } 

prova L'unità è quindi:

[TestFixture] 
public class TestClass 
{ 
     [Test] 
     public override void AssertThrowsNullReferenceOrInvalidOperation() 
     { 
      tempFunction = Controller.TestMethod; 
      base.AssertThrowsNullReferenceOrInvalidOperation(); 
     } 
}