Тестирование ASP.NET Core API контроллера с InMemory - PullRequest
1 голос
/ 16 октября 2019

Я пытаюсь протестировать контроллер API ASP.NET Core, используя базу данных InMemory вместо сервера SQL. Я также использую NUnit для написания своих тестов. В моем методе SetUp я создаю некоторые данные и добавляю их в свой контекст InMemory, который, кажется, работает нормально, но когда я пытаюсь извлечь данные с помощью моего контроллера, я получаю нулевые значения.

Это часть моего контроллера:

public class PeopleController : ControllerBase
{
    private ApplicationDbContext _context;
    private IMapper _mapper;
    public PeopleController(ApplicationDbContext context, IMapper mapper)
    {
        _context = context;
        _mapper = mapper;
    }

    // GET /api/people
    [HttpGet]
    public IActionResult GetPeople()
    {
        return Ok(_context.People.ToList().Select(_mapper.Map<Person, PersonDto>));
    }
}

А ниже - часть моего тестового класса. Когда я отлаживаю тест, два объекта Person, которые я добавляю в _context, были добавлены правильно, но когда я вызываю _controller.GetPeople(), два объекта не отображаются, но я получаю нулевое значение. Метод отлично работает "вживую", используя мой SQL Server.

[TestFixture]
class PeopleControllerTests
{
    private ApplicationDbContext _context;
    private IMapper _mapper;
    private PeopleController _controller;

    [SetUp]
    public void SetUp()
    {
        _mapper = GenerateConcreteInstance();

        var options = new DbContextOptionsBuilder<ApplicationDbContext>().UseInMemoryDatabase(databaseName: "TestDb").Options;
        _context = new ApplicationDbContext(options);

        _context.People.Add(new Person()
        { Id = 1, Firstname = "XXXXX", Lastname = "XXXXXXX", Email = "XXXX@XXXX.com", City = "XXXXX", DateCreated = DateTime.Now });
        _context.People.Add(new Person()
        { Id = 2, Firstname = "YYYYY", Lastname = "YYYYYYY", Email = "YYYY@YYYY.com", City = "YYYYY", DateCreated = DateTime.Now });
        _context.SaveChanges();

        _controller = new PeopleController(_context, _mapper);
    }

    [Test]
    public void GetAll_WhenCalled_ReturnPeopleInDb()
    {
        var result = _controller.GetPeople();

        var okObjectResult = result as OkObjectResult;
        var content = okObjectResult.Value as IEnumerable<Person>;
        Assert.IsNotNull(content);

    }

    private IMapper GenerateConcreteInstance()
    {
        var config = new AutoMapper.MapperConfiguration(c =>
        {
            c.AddProfile(new ApplicationProfile());
        });

        return config.CreateMapper();
    }
}

Буду очень признателен за любую помощь, так как я новичок в ASP.NET Core и тестировании в целом!

1 Ответ

0 голосов
/ 16 октября 2019

Вам нужно будет позвонить:

_context.SaveChanges()

, чтобы зафиксировать изменения в базе данных при добавлении новых записей с _context.Add(T).

...