【问题标题】:Testing BadRequest result based on Invalid Model基于无效模型测试 BadRequest 结果
【发布时间】:2019-01-20 03:33:50
【问题描述】:

我正在使用 C#、Net Core 2.2 和 XUnit 测试框架。

将无效模型传递给我的 Net Core WebApi 会返回错误请求。 所以在 Postman 中测试并且工作正常,但是当我尝试测试它时,我传递了一个 Invalid 模型并且 ModelState 始终有效,我该如何解决这个问题?

[Route("apia/[controller]")]
[ApiController]
public class MoviesController : ControllerBase
{
    private readonly IMovieRepository _movieRepository;

    public MoviesController(IMovieRepository movieRepository)
    {
        _movieRepository = movieRepository;
    }

    // GET apia/movies
    [HttpGet]
    public IActionResult Search([FromBody] MovieFilters filters)
    {
        if (!ModelState.IsValid)
        {
            return BadRequest(ModelState);
        }

        return Ok(_movieRepository.Search(filters));
    }
}

这是具有一些必需属性的模型:

public class MovieFilters
{
    [Required]
    public virtual string Title { get; set; }
    [Required]
    public virtual int? YearOfRelease { get; set; }
    [Required]
    public virtual string Genre { get; set; }
}

而失败的测试导致 ModelState 始终为真:

public class MoviesControllerTest: IClassFixture<MovieSeedDataFixture>
{
    private readonly MovieFilters _filters;
    private readonly MoviesController _controller;

    public MoviesControllerTest(MovieSeedDataFixture fixture)
    {
        var repository = new MovieRepository(fixture.MovieContext);
        _controller = new MoviesController(repository);
    }

    [Fact]
    public void Search_EmptyParametersPassed_ReturnsError400()
    {
        // Act
        var result = _controller.Search(new MovieFilters());

        // Assert
        Assert.IsType<BadRequestObjectResult>(result);
    }
}   

谢谢

【问题讨论】:

    标签: c# unit-testing asp.net-core asp.net-core-webapi xunit.net


    【解决方案1】:

    谢谢,我做了一些更改,现在工作得更好了,通过在控制器中手动添加 ModelState 错误,不确定是否有更好的方法,但正在工作。

    所以将这一行添加到代码中

     _controller.ModelState.AddModelError("Title", "Required");
    

    这是完整的代码:

    [Fact]
        public void Search_EmptyParametersPassed_ReturnsError400()
        {
            // Act
            _controller.ModelState.AddModelError("Title", "Required");
            var result = _controller.Search(new MovieFilters());
    
            // Assert
            Assert.IsType<BadRequestObjectResult>(result);
        }
    

    【讨论】:

    • ModelState 在执行controller.Search 方法之前在中间件中更新。因此,通过向ModelState 添加错误来“模仿”中间件将是正确的方法。
    • 另一种方法是集成测试,您将在其中测试整个“管道”,请查看 [docs.microsoft.com/en-us/aspnet/core/test/… ASP.NET Core 中的测试)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-19
    • 1970-01-01
    • 1970-01-01
    • 2015-04-15
    • 1970-01-01
    • 2021-10-01
    相关资源
    最近更新 更多