2016-10-07 2 views
1

Ich habe versucht, einige Komponententests für eine Web-API-Aktion-Methode während der Ausnahme zu schreiben. So unter meiner AktionsmethodeUnit-Test für Web-API-Aktion Methode reagiert während Ausnahme

[Route("{userName}/{searchCriteria}")] 
[HttpGet] 
public IHttpActionResult Events(string accountNumber, string searchCriteria) 
{ 
    try 
    { 
     bool isInputValid = _inputValidation.IsTrackingEventInputValid(accountNumber, searchCriteria); 
     if (isInputValid) 
     { 
      return OK ("my data"); 
     } 
     else 
     { 
      throw new ArgumentException(); 
     } 
    } 
    catch (ArgumentException ae) 
    { 
     return new ResponseMessageResult(Request.CreateErrorResponse(HttpStatusCode.BadRequest, ExceptionHandlingMessages.InvalidArgumentException)); 
    } 
    catch (Exception ex) 
    { 
     return new ResponseMessageResult(Request.CreateErrorResponse(HttpStatusCode.InternalServerError, ExceptionHandlingMessages.InternalServerError)); 
    } 
} 

Ich möchte Statuscode überprüfen reagiert und reagiert auf Meldungen, während eine Ausnahme auftritt. Aber Problem ist, sobald meine Ausführung ResponseMessageResult Code trifft, wirft es einen anderen ArgumentNullException, der Value cannot be null.Parameter name: request sagt. Aus diesem Grund kehrt die Steuerung nie zu meiner Komponententestmethode zurück.

Meine Einheit Testmethode als

[TestMethod] 
public void Events() 
{ 
    _mockInputValidation.Setup(x => x.IsTrackingEventInputValid(It.IsAny<string>(), It.IsAny<string>())).Returns(false); 
    //act 
    IHttpActionResult actionResult = _trackingEventController.Events(string.Empty, string.Empty); 
    //assert 
} 

ich versuche, auch [ExpectedException(type)] setzen, aber nicht viel hilfreich

wie kann ich dieses Problem lösen

+0

Wenn Sie die Rückgabewerte im 'catch' Block testen wollen, nur eine Ausnahme in' _inputValidation.IsTrackingEventInputValid' werfen. Ich erinnere mich nicht an die tatsächliche Syntax, aber die Mock zu '_mockInputValidation.Setup ändern (x => x.IsTrackingEventInputValid (It.IsAny (), It.IsAny ())). Wirft (neue ArgumentException());' sollte Ihnen erlauben, das erste 'ResponseMessageResult' zu erhalten. – Howwie

+0

Zeigen Sie, wie Sie den Controller neu starten. Höchstwahrscheinlich ist die Anfrage null – Nkosi

+1

Ich würde den Wert des Unit-Tests einer Aktionsmethode explizit in Frage stellen - ihr Verhalten hängt von vielen externen Framework-Setups ab. Es wäre besser, das Verhalten innerhalb der Aktionsmethoden zu minimieren (hinter Schnittstellen zu schieben) und Ende-zu-Ende mit Akzeptanztests zu testen, die tatsächlich die Endpunkte mit HTTP-Anforderungen erreichen. –

Antwort

1

Code Umgestalten und zu vermeiden versuchen, Ausnahmen in Ihren Aktionen werfen . Lassen Sie den Ausnahmebehandler/Filter sie behandeln (übergreifende Bedenken). Ihr ursprüngliches Problem konnte auftreten, wenn Sie keine ordnungsgemäße Anforderungsnachricht für den Komponententest angegeben haben.

[Route("{userName}/{searchCriteria}")] 
[HttpGet] 
public IHttpActionResult Events(string accountNumber, string searchCriteria) { 
    bool isInputValid = _inputValidation.IsTrackingEventInputValid(accountNumber, searchCriteria); 
    if (isInputValid) { 
     return Ok("my data"); 
    } else { 
     return BadRequest(ExceptionHandlingMessages.InvalidArgumentException); 
    } 
} 

Und dann für den speziellen Testfall

[TestMethod] 
public void IsTrackingEventInputValid_When_False_Should_Return_BadRequest() { 
    //Arrange 
    _mockInputValidation.Setup(x => x.IsTrackingEventInputValid(It.IsAny<string>(), It.IsAny<string>())).Returns(false); 
    var expected = ExceptionHandlingMessages.InvalidArgumentException; 
    //Act 
    var actionResult = _trackingEventController.Events(string.Empty, string.Empty) as BadRequestErrorMessageResult; 
    //Assert 
    Assert.IsNotNull(actionResult); 
    Assert.AreEqual(expected, actionResult.Message); 
} 
Verwandte Themen