2017-10-19 7 views
1

J'utilise le framework de test fourni avec Visual Studio, ainsi que NSubstitute pour tester une méthode qui prend un ID système et déclenche une exception si le système ne peut pas être trouvé dans la base de données ...NSubstitute: Assert ne contient pas de définition pour les lancements

public VRTSystem GetSystem(int systemID) 
{ 
    VRTSystem system = VrtSystemsRepository.GetVRTSystemByID(systemID); 
    if (system == null) 
    { 
    throw new Exception("System not found"); 
    } 
    return system; 
} 

(dans le cas où cela semble étrange, il y a une étude de cas spécifique pour cette méthode qui nécessite de lancer une exception, en retour d'un système nul n'est pas acceptable pour son utilisation)

Je souhaite écrire un test pour vérifier qu'une exception est levée si le système n'existe pas. J'ai actuellement les suivantes ...

[TestMethod] 
public void LicensingApplicationServiceBusinessLogic_GetSystem_SystemDoesntExist() 
{ 
    var bll = new LicensingApplicationServiceBusinessLogic(); 
    try 
    { 
    VRTSystem systemReturned = bll.GetSystem(613); 
    Assert.Fail("Should have thrown an exception, but didn't.); 
    } 
    catch() { } 
} 

En ne se moquant du référentiel, le système retourné par VrtSystemsRepository.GetVRTSystemByID() sera nulle, et l'exception levée. Alors que cela fonctionne, il me semble mal. Je n'aurais pas pensé avoir besoin d'un bloc try/catch dans un test.

Le NSubstitute docs ont un exemple qui suppose que je devrais pouvoir tester cela comme suit ...

[TestMethod] 
public void GetSystem_SystemDoesntExist() 
{ 
    var bll = new LicensingApplicationServiceBusinessLogic(); 
    Assert.Throws<Exception>(() => bll.GetSystem(613)); 
} 

Cependant, si je tente dans mon code de test, je reçois Throws en rouge, la Le message d'erreur "Assert ne contient pas de définition pour les lancers"

Maintenant, je ne suis pas sûr que l'exemple de cette page couvre mon scénario, car le code de test spécifie que la méthode testée émet une exception. Je ne comprends pas vraiment, car je pensais que l'idée des essais consistait à laisser la méthode à l'essai seule et à tester ce qui se passe dans divers scénarios. Cependant, même sans cela, je ne comprends pas pourquoi la méthode Assert.Throws n'existe pas.

Quelqu'un a des idées? DavidG a fait remarquer que Assert.Throws fait probablement partie de NUnit, pas du framework MS, ce qui expliquerait pourquoi il n'est pas reconnu. Si oui, est-ce que la façon dont je suis en train de tester la bonne façon de le faire?

+1

Quelle structure de test utilisez-vous? 'Assert.Throws' est probable pour NUnit. – DavidG

+0

@DavidG Ah, j'ai oublié d'ajouter ça, désolé. J'utilise le MS qui vient avec VS. Je vais mettre à jour la question. –

+1

@AvrohomYisroel comme mentionné par DavidG La documentation référencée utilise NUnit pour les assertions. Si vous n'utilisez pas ce framework, vous pouvez utiliser la classe ['ExpectedExceptionAttribute Class'] (https://msdn.microsoft.com/en-us/library/microsoft.visualstudio.testtools.unittesting.expectedexceptionattribute.aspx) – Nkosi

Répondre

2

Comme mentionné par DavidG La documentation référencée utilise NUnit pour les assertions.

Si ne pas utiliser ce cadre, vous pouvez utiliser le ExpectedExceptionAttribute Class

[TestMethod] 
[ExpectedException(typeof(<<Your expected exception here>>))] 
public void GetSystem_SystemDoesntExist() { 
    var bll = new LicensingApplicationServiceBusinessLogic(); 
    bll.GetSystem(613); 
} 

qui échouera si l'exception attendue n'est pas levée.

+1

Encore mieux, ajoutez une méthode AssertThrows(), qui est beaucoup plus propre. Voir cette page MSDN pour plus d'informations https://msdn.microsoft.com/library/jj159340.aspx#sec18 –