«OneTimeSetUp: не найдено подходящего конструктора» Интеграционное тестирование с ApplicationDbContext - PullRequest
0 голосов
/ 12 июня 2018

У меня проблема с интеграционным тестированием в бритвенном приложении в сочетании с MVVM.Все мои классы используют ApplicationDbContext.

Класс Test:

[TestFixture]
public class ApiParserControllerTests
{
    private readonly ApplicationDbContext _dbContext;
    public ApiParserControllerTests(ApplicationDbContext dbContext)
    {
        _dbContext = dbContext;
    }
    [Test]
    public void IsOptionValid_Teacher_ShouldReturnTrue()
    {
        var model = new ApiParserController(_dbContext);
        var assign = model.IsOptionValid("Teacher");

        Assert.AreEqual(true, assign.Value);
    }

Класс метода:

public class ApiParserController : Controller
{
    private readonly ApplicationDbContext _dbContext;

    public ApiParserController(ApplicationDbContext dbContext)
    {
        _dbContext = dbContext;
    }

    [HttpPost]
    public JsonResult IsOptionValid(string Option)
    {
        return Json(_dbContext.Import.Any(x => x.Option.ToLower() == Option.ToLower()));
    }
}

Запуск этого кода вызывает ошибку в заголовке.Я попытался добавить пустой конструктор, чтобы решить эту проблему, однако это просто делает ApplicationDbContext нулевым.

Чего мне здесь не хватает?

РЕДАКТИРОВАТЬ:

Я добавил модульный тест для этого метода, который проверяет базу данных с использованием inMemory:

    [Test]
    public void IsOptionValid_Teacher_ShouldReturnTrue()
    {
        //Arrange
        var optionsbuilder = new DbContextOptionsBuilder<ApplicationDbContext>();
        optionsbuilder.UseInMemoryDatabase(databaseName: "TeacherDB");
        var _dbContext = new ApplicationDbContext(optionsbuilder.Options);

        JsonResult json = new JsonResult(true);
        _dbContext.ImportOption.Add(new ImportOption { Id = 1, isUnique = 1, Option = "Teacher" });
        _dbContext.SaveChanges();
        //Act
        var model = new ApiParserController(_dbContext);
        var assign = model.IsOptionValid("Teacher");
        //Assert
        Assert.AreEqual(true, assign.Value);
    }

Ответы [ 2 ]

0 голосов
/ 29 августа 2018

Удалите конструктор по умолчанию в ваших ApiParserControllerTests, используйте вместо этого функцию [SetUp].

[TestFixture]
public class ApiParserControllerTests
{
    private ApplicationDbContext _dbContext;

    [SetUp]
    public void SetUp(){
        // initialize here
       _dbContext = new ApplicationDbContext();
    }

    [Test]
    public void IsOptionValid_Teacher_ShouldReturnTrue()
    {
        var model = new ApiParserController(_dbContext);
        var assign = model.IsOptionValid("Teacher");

        Assert.AreEqual(true, assign.Value);
    }
}
0 голосов
/ 12 июня 2018

Вы определили прибор с помощью конструктора, который принимает ApplicationDbContext.Это означает, что вам нужно предоставить NUnit такой объект, чтобы он мог вызывать конструктор.

OTOH, используя TestFixture без каких-либо аргументов, вы говорите NUnit использовать конструктор по умолчанию.Это источник исходного сообщения об ошибке, так как у класса не было конструктора по умолчанию.

Добавление конструктора по умолчанию позволяет NUnit создавать класс вашего прибора, но это все равно не дает вам необходимый dbContextдля запуска теста.

Обычно вы предоставляете аргумент конструктору приборов, передавая его в качестве аргумента TestFixtureAttribute.Это может быть трудно сделать в вашем случае, и может быть проще либо создать контекст в OneTimeSetUp для класса, либо смоделировать контекст.То, что вы делаете, зависит от того, что именно вы пытаетесь проверить, что не ясно из вопроса.

В одном из ваших комментариев вы упоминаете, что хотите использовать «текущий dbContext».Это может быть ключом, если вы можете объяснить это дальше.Что вы подразумеваете под "текущим" здесь?Где этот контекст создан?Затем мы можем выяснить, как ваш тест может получить к нему доступ.

...