我在与 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/