“OneTimeSetUp:找不到合适的构造函数”使用ApplicationDbContext进行集成测试

时间:2018-06-12 11:18:13

标签: c# razor mvvm nunit

我在剃须刀应用程序中结合MVVM进行集成测试时遇到了问题。我的所有类都使用ApplicationDbContext。

测试类:

[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为null。

我在这里缺少什么?

编辑:

我为此方法添加了一个单元测试,使用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 :(得分:0)

您使用带有ApplicationDbContext的构造函数定义了一个fixture。这意味着你需要为NUnit提供这样一个对象,以便它可以调用构造函数。

OTOH,通过使用TestFixture而没有任何参数,您告诉NUnit使用默认构造函数。这是原始错误消息的来源,因为该类没有默认构造函数。

添加默认构造函数使NUnit可以构造fixture类,但是仍然没有为您提供运行测试所需的dbContext。

通常,您可以通过将其作为参数传递给TestFixtureAttribute来为夹具构造函数提供参数。在您的情况下,这可能很难做到,在类的OneTimeSetUp中构造上下文或模拟上下文可能更简单。您所做的事情取决于您要测试的具体内容,但问题并不明确。

在你的一条评论中,你提到想要使用“当前的dbContext”。如果你能进一步解释,这可能是关键。这里的“当前”是什么意思?这个背景在哪里创建?然后我们可以弄清楚您的测试如何访问它。

答案 1 :(得分:0)

在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);
    }
}