Тестирование результата BadRequest на основе неверной модели - PullRequest
0 голосов
/ 19 января 2019

Я использую C #, Net Core 2.2 и среду тестирования XUnit.

Передача неверной модели в мой Net Core WebApi возвращает неверный запрос.Итак, протестировано в Postman и работает нормально, но когда я пытаюсь протестировать его, я пропускаю недопустимую модель, и там всегда действует 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);
    }
}   

Спасибо

1 Ответ

0 голосов
/ 19 января 2019

Спасибо, я внес некоторые изменения и теперь работаю лучше, добавив вручную ошибку 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);
    }
...