Ho un regolatore di UserController
con questa azioneNunit asincrona eccezione prova affermazione
// GET /blah
public Task<User> Get(string domainUserName)
{
if (string.IsNullOrEmpty(domainUserName))
{
throw new ArgumentException("No username specified.");
}
return Task.Factory.StartNew(
() =>
{
var user = userRepository.GetByUserName(domainUserName);
if (user != null)
{
return user;
}
throw new HttpResponseException(Request.CreateErrorResponse(HttpStatusCode.NotFound, string.Format("{0} - username does not exist", domainUserName)));
});
}
Sto cercando di scrivere un test per il caso in cui butto un'eccezione 404.
Ecco quello che ho provato, con l'uscita -
1)
[Test]
public void someTest()
{
var mockUserRepository = new Mock<IUserRepository>();
mockUserRepository.Setup(x => x.GetByUserName(It.IsAny<string>())).Returns(default(User));
var userController = new UserController(mockUserRepository.Object) { Request = new HttpRequestMessage() };
Assert.That(async() => await userController.Get("foo"), Throws.InstanceOf<HttpResponseException>());
}
Risultato test fallito
Expected: instance of <System.Web.Http.HttpResponseException>
But was: no exception thrown
2)
[Test]
public void someTest()
{
var mockUserRepository = new Mock<IUserRepository>();
mockUserRepository.Setup(x => x.GetByUserName(It.IsAny<string>())).Returns(default(User));
var userController = new UserController(mockUserRepository.Object) { Request = new HttpRequestMessage() };
var httpResponseException = Assert.Throws<HttpResponseException>(() => userController.Get("foo").Wait());
Assert.That(httpResponseException.Response.StatusCode, Is.EqualTo(HttpStatusCode.NotFound));
}
Risultato Test fallito
Expected: <System.Web.Http.HttpResponseException>
But was: <System.AggregateException> (One or more errors occurred.)
3)
[Test]
public void someTest()
{
var mockUserRepository = new Mock<IUserRepository>();
mockUserRepository.Setup(x => x.GetByUserName(It.IsAny<string>())).Returns(default(User));
var userController = new UserController(mockUserRepository.Object) { Request = new HttpRequestMessage() };
var httpResponseException = Assert.Throws<HttpResponseException>(async() => await userController.Get("foo"));
Assert.That(httpResponseException.Response.StatusCode, Is.EqualTo(HttpStatusCode.NotFound));
}
Risultato test fallito
Expected: <System.Web.Http.HttpResponseException>
But was: null
4)
[Test]
[ExpectedException(typeof(HttpResponseException))]
public async void ShouldThrow404WhenNotFound()
{ var mockUserRepository = new Mock<IUserRepository>();
mockUserRepository.Setup(x => x.GetByUserName(It.IsAny<string>())).Returns(default(User));
var userController = new UserController(mockUserRepository.Object) { Request = new HttpRequestMessage() };
var task = await userController.Get("foo");
}
Risultato test passa
Questions -
- Perché sarebbe Assert.Throws non gestisce HttpResponseException, quando ExpectedException fa?
- Non voglio testare solo l'eccezione generata. Voglio far valere il codice di stato della risposta. Qual è il modo di fare questo?
Qualsiasi confronto su questo comportamento e la sua causa/e sarebbe fantastico!
si dovrebbe aggiungere più codice dal tuo pubblico Task Get (stringa domainUserName) come tutti i test sono per DomainUser = "foo" e l'unico errore che hai mostrato è per empty domainUser (o null) –
JleruOHeP
@JleruOHeP - grazie -got portato via un po '. Ho modificato il codice. –
Dopo le modifiche tutte le test case sono sempre le stesse? E il caso 1 non fa ancora eccezione? – JleruOHeP