猿问

“OneTimeSetUp:未找到合适的构造函数”与 ApplicationDbContext

我有一个关于与 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 为空。


我在这里缺少什么?


编辑:


我为此方法添加了一个单元测试,它使用 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);

    }


FFIVE
浏览 220回答 2
2回答

杨__羊羊

删除 ApiParserControllerTests 中的默认构造函数,改用 [SetUp] 函数。[TestFixture]public class ApiParserControllerTests{&nbsp; &nbsp; private ApplicationDbContext _dbContext;&nbsp; &nbsp; [SetUp]&nbsp; &nbsp; public void SetUp(){&nbsp; &nbsp; &nbsp; &nbsp; // initialize here&nbsp; &nbsp; &nbsp; &nbsp;_dbContext = new ApplicationDbContext();&nbsp; &nbsp; }&nbsp; &nbsp; [Test]&nbsp; &nbsp; public void IsOptionValid_Teacher_ShouldReturnTrue()&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; var model = new ApiParserController(_dbContext);&nbsp; &nbsp; &nbsp; &nbsp; var assign = model.IsOptionValid("Teacher");&nbsp; &nbsp; &nbsp; &nbsp; Assert.AreEqual(true, assign.Value);&nbsp; &nbsp; }}

Qyouu

您定义了一个带有构造函数的装置,该构造函数采用ApplicationDbContext.&nbsp;这意味着您需要为 NUnit 提供这样一个对象,以便它可以调用构造函数。OTOH,通过TestFixture不带任何参数使用,您是在告诉 NUnit 使用默认构造函数。这是原始错误消息的来源,因为该类没有默认构造函数。添加默认构造函数使 NUnit 可以构建您的夹具类,但这仍然不能为您提供运行测试所需的 dbContext。通常,您可以通过将参数作为参数传递给TestFixtureAttribute.&nbsp;在您的情况下,这可能很难做到,并且在 OneTimeSetUp 中为类构造上下文或模拟上下文可能更简单。您做什么取决于您要测试的内容,这在问题中并不清楚。在您的评论之一中,您提到想要使用“当前的 dbContext”。如果您能进一步解释,这可能是关键。这里的“当前”是什么意思?该上下文是在哪里创建的?然后我们可以弄清楚您的测试如何访问它。
随时随地看视频慕课网APP
我要回答