c# - visual - pruebas unitarias mvc 5
Modelo de validaciĆ³n de estado en pruebas unitarias. (3)
Como se mencionó anteriormente, necesita pruebas de integración para validar el ModelState. Entonces, con Asp.Net Core, estoy investigando esta pregunta para agregar una solución simple para integrar las pruebas con Asp.Net Core y la validación de ModelState
Agregue el paquete Microsoft.AspNetCore.TestHost
y puede enviar solicitudes de esta forma:
var server = new TestServer(new WebHostBuilder().UseStartup<Startup>());
var client = server.CreateClient();
var model = new { Name = String.Empty };
var content = new StringContent(JsonConvert.SerializeObject(model), Encoding.UTF8, "application/json");
var result = await client.PostAsync("/api/yourApiEndpoint", content);
result.StatusCode.Should().Be(HttpStatusCode.BadRequest);
Puede encontrar más información al respecto aquí: http://asp.net-hacker.rocks/2017/09/27/testing-aspnetcore.html
Espero eso ayude.
Estoy escribiendo una prueba de unidad para un controlador como este:
public HttpResponseMessage PostLogin(LoginModel model)
{
if (!ModelState.IsValid)
return new HttpResponseMessage(HttpStatusCode.BadRequest);
}
el modelo se ve como
public class LoginModel
{
[Required]
public string Username { set; get; }
[Required]
public string Password { set; get; }
}
Entonces tengo prueba de unidad como esta:
[TestMethod]
public void TestLogin_InvalidModel()
{
AccountController controller = CreateAccountController();
...
var response = controller.PostLogin(new LoginModel() { });
Assert.AreEqual(HttpStatusCode.BadRequest, response.StatusCode);
}
En realidad, el ModelState está validado ... lo cual es extraño para mí ya que ambos campos son obligatorios ... ¿Alguien podría recomendarlo?
La razón por la que el estado del modelo es válido es que se crea un nuevo estado de modelo cuando se inicia una nueva controladora. La API web no hace el enlace de parámetros por usted aquí, por lo que ni siquiera tiene la oportunidad de agregar errores de estado de modelo.
Si desea mantener esto como una prueba de unidad, debe agregar los errores de estado del modelo y probar lo que sucede.
Si desea probar que el estado del modelo no sería válido en una solicitud real, le recomiendo que lea esta publicación del blog:
http://blogs.msdn.com/b/youssefm/archive/2013/01/28/writing-tests-for-an-asp-net-webapi-service.aspx
e intente probar contra un servidor en memoria. Una nota menor para su caso sería que tal vez quiera usar un StringContent en lugar de un ObjectContent en la solicitud para asegurarse de que la API web intente deserializar y enlazar el cuerpo correctamente.
TL; DR Si no quieres leer el artículo completo proporcionado por Youssef y quieres una solución rápida para hacer que ModelState.IsValid devuelva false. Hacer esto.
[TestMethod]
public void TestLogin_InvalidModel()
{
AccountController controller = CreateAccountController();
// new code added -->
controller.ModelState.AddModelError("fakeError", "fakeError");
// end of new code
...
var response = controller.PostLogin(new LoginModel() { });
Assert.AreEqual(HttpStatusCode.BadRequest, response.StatusCode);
}
Ahora puedo imaginar que el CreateAccountController () se ve algo así como mínimo ->
return new AccountApiController()
{
Request = new HttpRequestMessage(),
Configuration = new HttpConfiguration()
};
Espero que esto da una respuesta rápida para aquellos googlear :)