我尝试测试我的应用程序,因此我需要模拟我的 EF 上下文。
我的代码似乎没问题,但有以下异常:
“System.ArgumentNullException:值不能为空。参数名称:
来源”
这是我的测试方法:
var options = new DbContextOptionsBuilder<ProductContext>().Options;
var settings = new SqlSettings
{
InMemory = true
};
var context = new Mock<ProductContext>(options, settings);
var mockTreeService = new TreeService(context.Object);
await mockTreeService.CreateTreeAsync("Testing tree", Guid.NewGuid());
context.Verify(x => x.AddAsync(It.IsAny<Tree>(), CancellationToken.None), Times.Once);
看起来这个异常是在执行这段代码时抛出的
var tree = await _context.Trees
.Include(x => x.Translation)
.FirstOrDefaultAsync(x => x.Translation.Pl == name);
它来自我正在测试的服务
我认为这是由于没有设置连接字符串造成的。坦白说,完全模拟有点困难DbContext
,这就是 EF Core 团队提供内存中实现的原因。这对于测试目的来说更容易使用。只需改变你的options
初始化为:
var options = new DbContextOptionsBuilder<ProductContext>()
.UseInMemoryDatabase(Guid.NewGuid().ToString())
.Options;
然后,您需要使用测试数据填充数据库。然后,您可以运行其余的测试。
注意:如果您使用内存数据库,则无需再模拟上下文,因此您可以删除该代码。内存数据库本身本质上就是一个模拟。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)