我是Web API应用程序XUnit
测试的新手。我试图用状态代码404断言我的响应值,但我不知道该怎么做。
这是我的测试代码。
假设输入为null,测试应返回NotFound或404 状态代码。
[Fact]
public async Task getBooksById_NullInput_Notfound()
{
//Arrange
var mockConfig = new Mock<IConfiguration>();
var controller = new BookController(mockConfig.Object);
//Act
var response = await controller.GetBooksById(null);
//Assert
mockConfig.VerifyAll();
Assert(response.StatusCode, HttpStatusCode.NotFound()); //How to achieve this?
}
在此测试方法的最后一行中,我无法进行response.StatusCode
编译,因为响应变量中没有StatusCode
属性。而且我没有HttpStatusCode
课程可以打电话......
这是控制器类中的GetBooksByID()
方法。
public class BookController : Controller
{
private RepositoryFactory _repositoryFactory = new RepositoryFactory();
private IConfiguration _configuration;
public BookController(IConfiguration configuration)
{
_configuration = configuration;
}
[HttpGet]
[Route("api/v1/Books/{id}")]
public async Task<IActionResult> GetBooksById(string id)
{
try
{
if (string.IsNullOrEmpty(id))
{
return BadRequest();
}
var response = //bla
//do something
if (response == null)
{
return NotFound();
}
return new ObjectResult(response);
}
catch (Exception e)
{
throw;
}
}
谢谢!
答案 0 :(得分:1)
您可以检查返回的类型
// Act
var actualResult = await controller.GetBooksById(null);
// Assert
actualResult.Should().BeOfType<BadRequestResult>();
Should()
和.BeOfType<T>
是来自FluentAssertions库的方法,可在Nuget上找到
答案 1 :(得分:1)
旧问题,但是尽管接受的答案是有效的,但它会引入另一个有用的依赖关系,但并非必须这样做。最直接的方法是参考:
using Microsoft.AspNetCore.Mvc;
然后用以下方法进行测试:
Assert.IsAssignableFrom<NotFoundObjectResult>(response.Result);
假设您的方法返回一个ActionResult。
答案 2 :(得分:0)
Assert.Equal(System.Net.HttpStatusCode.Unauthorized,response.StatusCode);
答案 3 :(得分:-1)
在获得@Brad的提示后,代码会编译并通过测试。
response.ToString().Equals(HttpStatusCode.NotFound);