为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
FFIVE 2021-08-07 16:54:16
我有一个关于与 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);    }
查看完整描述

2 回答

?
杨__羊羊

TA贡献1943条经验 获得超7个赞

删除 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);

    }

}


查看完整回答
反对 回复 2021-08-07
?
Qyouu

TA贡献1786条经验 获得超11个赞

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

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

添加默认构造函数使 NUnit 可以构建您的夹具类,但这仍然不能为您提供运行测试所需的 dbContext。

通常,您可以通过将参数作为参数传递给TestFixtureAttribute. 在您的情况下,这可能很难做到,并且在 OneTimeSetUp 中为类构造上下文或模拟上下文可能更简单。您做什么取决于您要测试的内容,这在问题中并不清楚。

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


查看完整回答
反对 回复 2021-08-07
  • 2 回答
  • 0 关注
  • 219 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信