【发布时间】:2016-12-25 21:53:44
【问题描述】:
以下是由于 .ToListAsync() 不受内存数据库集支持而在 .ShouldNotThrow() 上失败的那种测试(我没有方便的确切措辞,但你明白了)。万一它很重要,我正在尝试模拟实体框架版本提供的数据库集。 6.1.3:
[TestFixture]
public class Tests
{
private SomeRepository _repository;
private Mock<DbSet<SomeEntity>> _mockDbSet;
private Mock<IApplicationDbContext> _mockAppDbContext;
[OneTimeSetUp]
public void TestFixtureSetUp()
{
_mockDbSet = new Mock<DbSet<SomeEntity>>();
_mockAppDbContext = new Mock<IApplicationDbContext>();
_mockAppDbContext.SetupGet(c => c.Gigs).Returns(_mockGigsDbSet.Object);
_repository = new SomeRepository(_mockAppDbContext.Object);
}
[Test]
public void Test()
{
// Setup
var results = (IEnumerable<SomeEntity>) null;
var singleEntity = new SomeEntity {Id = "1"};
_mockDbSet.SetSource(new List<SomeEntity> { singleEntity });
// Act
var action = new Func<Task>(async () =>
{
results = await _repository.GetMultipleAsync(); //this ends up calling "await mockDbSet.ToListAsync().ConfigureAwait(false)" internally
});
// Verify
action.ShouldNotThrow(); //an exception is thrown about .ToListAsync() not being supported by in-memory dbsets or something to that effect
results.Should().BeEmpty();
}
}
如果同步使用 .ToList() 代替基于异步的 .ToListAsync(),上述测试将按预期工作。在实际的 asp.net 中使用时,存储库也可以正常工作。
那么在这些单元测试中模拟 .ToListAsync() 的 dbset 以工作的正确方法是什么?
P.S.:我一直在进行单元测试的项目可以在这里找到:
https://bitbucket.org/dsidirop/gighub
由于 .ToListAsync() 而失败的单元测试标有注释“暂时失败”。
【问题讨论】:
-
要完全模拟 EF DbContext 有很多麻烦。仅链接的答案不受欢迎,但这是在手机上输入的大量信息,所以我将其作为评论留下。 Mocking an EF DbContext.
标签: asp.net entity-framework unit-testing