2010-01-17 6 views
1

Je me retrouve à écrire ce code tout le temps:Comment créer une méthode qui accepte une expression lambda


[TestMethod] 
[Description("Asserts that an ArgumentNullException is thrown if ResetPassword(null) is called")] 
public void ResetPassword_Throws_ArgumentNullException_With_Null_Parameter() 
{ 
    try 
    { 
     new MembershipServiceProvider().ResetPassword(null); 
    } 
    catch (ArgumentNullException) 
    { 
     // ArgumentNullException was expected 
     Assert.IsTrue(true); 
    } 
    catch 
    { 
     Assert.Fail("ArgumentNullException was expected"); 
    } 
} 

Ainsi, au lieu d'écrire ce code encore et je voudrais vraiment créer une méthode qui accepte une expression Lambda qui exécutera la méthode dans le bloc try.

Quelque chose comme ceci:


public void AssertExpectedException(Action theAction) where TException : Exception 
{ 
    try 
    { 
     // Execute the method here 
    } 
    catch (TException) 
    { 
     Assert.IsTrue(true); 
    } 
    catch 
    { 
     Assert.Fail(string.Format("An exception of type {0} was expected", typeof(TException))); 
    } 
} 

Je peux donc faire quelque chose comme ceci:


var provider = new MembershipServiceProvider(); 
AssertExpectedException(provider => provider.ResetPassword(null)); 

Je ne suis pas sûr que tout cela est sur la bonne voie, mais nous espérons que quelqu'un peut pointer moi dans la bonne direction.

Merci

Répondre

2

Vous y êtes presque. Voici ce que l'aide de test devrait ressembler à:

public void AssertExpectedException<TException>(Action theAction) 
    where TException : Exception 
{ 
    try 
    { 
     // Execute the method here 
     theAction(); 
    } 
    catch (TException) 
    { 
     // The Assert here is not necessary 
    } 
    catch 
    { 
     Assert.Fail(string.Format(
      "An exception of type {0} was expected", 
      typeof(TException))); 
    } 
} 

Et pour l'appeler:

var provider = new MembershipServiceProvider(); 
AssertExpectedException<ArgumentNullException>(() => provider.ResetPassword(null)); 

Notez l'utilisation de () => something ce qui signifie que le lambda n'a pas de paramètres. Vous devez également spécifier l'argument générique ArgumentNullException car le compilateur ne peut pas l'inférer.

1

Ce qui suit devrait faire ce que vous avez besoin (j'ai ajouté le paramètre de type pour TException et l'invocation de theAction).

public void AssertExpectedException<TException>(Action theAction) 
    where TException : Exception 
{ 
    try 
    { 
     theAction(); 
    } 
    catch (TException) 
    { 
     Assert.IsTrue(true); 
    } 
    catch 
    { 
     Assert.Fail(string.Format("An exception of type {0} was expected", 
      typeof(TException))); 
    } 
} 

Vous pouvez l'appeler avec le code suivant:

var provider = new MembershipServiceProvider(); 
AssertExpectedException<ArgumentNullException>(() => provider.ResetPassword(null)); 

Vous devez spécifier l'argument de type pour indiquer quel type d'exception pour tester. La syntaxe () => ... est une expression lambda qui ne prend aucun paramètre.

+0

Parfait! Merci beaucoup. – devlife

+0

Comment exécutez-vous l'action avec un paramètre? – devlife

+0

Désolé pour la mise en forme .... Si j'ai ceci: publique vide AssertExpectedException (Action theAction) où TException: Exception { theAction(); // Cela ne fonctionne pas. } AssertExpectedException (a => a.DoSomething ("test", 123);. theAction() ne fonctionne pas je dois passer deux paramètres Comment pourrais-je. faire avec l'action qui est passé dans Quelque chose comme ça (bien que cela ne fonctionnerait pas en fait :-)): theAction (theAction.FirstParameter, theAction.SecondParameter) – devlife

Questions connexes