我在剃须刀应用程序中结合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);
}
答案 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);
}
}