c# - “OneTimeSetUp: No suitable constructor was found”与ApplicationDbContext的集成测试

标签 c# razor mvvm nunit

我在与 Razor 应用程序结合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);
    }

最佳答案

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

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

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

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

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

关于c# - “OneTimeSetUp: No suitable constructor was found”与ApplicationDbContext的集成测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50815867/

相关文章:

android - Android 中 MVP 相对于 MVVM 设计模式的缺点

c# - UI 自动化 cmdlet 找不到控件

c# - 如何针对不受我控制的服务进行测试?

c# - 如何构建动态命令对象?

ajax - 使用带有下拉列表 mvc3 的 ajax

razor - 在身份3中创建声明身份

c# - 在datagrid中添加context menu,如何获取select Item的值

c# - 显示错误通知时禁用默认声音

c# - 在 JavaScript 和 C# Controller 之间传递数据 : Asp.Net MVC 4 Razor

c# - Datagrid MVVM WPF中的复选框