I'm trying to write some tests to some of our controllers. To keep it simple I'll use a simple class as example.
Imagine that I've a controller that returns an json object on success using Json function inherited from Controller
[ApiController]
[Route("[controller]")]
public class ExampleController:Controller
{
[HttpGet]
public async Task<IActionResult> Get()
{
return await Task.FromResult(new OkObjectResult(new {Message="Success"}));
}
[HttpGet("json")]
public async Task<IActionResult> GetJson()
{
return await Task.FromResult(Json(new { Message = "Success" }));
}
}
Then I have the following test methods:
[TestMethod]
public void TestOkResult()
{
var services = new ServiceCollection();
services.AddScoped<ExampleController>();
var controller = services.BuildServiceProvider().GetRequiredService<ExampleController>();
var result = controller.Get().Result;
var parsedResult = result as OkObjectResult;
Assert.IsInstanceOfType<OkObjectResult>(result);
Assert.AreEqual(200, parsedResult?.StatusCode ?? 500);
}
[TestMethod]
public void TestJsonResult()
{
var services = new ServiceCollection();
services.AddScoped<ExampleController>();
var controller = services.BuildServiceProvider().GetRequiredService<ExampleController>();
var result = controller.GetJson().Result;
var parsedResult = result as JsonResult;
Assert.IsInstanceOfType<JsonResult>(result);
Assert.AreEqual(200, parsedResult?.StatusCode ?? 500);
}
The method TestJsonResult can't assert the status code, because it's always null
Any ideas?
Jsonmethod on aControlleris using default constructor ofJsonResultwhich is not setting StatusCode by default. You have to do it yourself:new JsonResult(new { Message = "Success" }) { StatusCode = StatusCodes.Status200OK }. More about it in here: stackoverflow.com/questions/42360139/…asyncbut your test does not execute the controller withawait. If you execute the controller method using await, does that change the results? See How does one test async code using MSTest for more info.