以下は、メモリ内のdbsetsでサポートされていない.ToListAsync()のために.ShouldNotThrow()が失敗するテストの種類です(私は正確な文言は便利ですが、あなたは写真を手に入れます)。それが重要な場合は、Entity Framework verによって提供されるdbsetをモックアップしようとしています。 6.1.3:ユニットテスト.ToListAsync()をメモリ内で使用する
[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をモックアップする正しい方法は何ですか?
PS:私はユニットテストしてきたプロジェクトでは、ここで見つけることができます:.ToListAsync(による失敗
https://bitbucket.org/dsidirop/gighub
ユニットテストは)コメントでマークされているが「当分の間、失敗しました'
EF DbContextを完全にモックするために飛び越すためのフープがたくさんあります。リンクのみの回答は歓迎されていますが、これは電話で入力する情報の多くですから、コメントとして残しておきます。 [EF DbContextを嘲笑](https://msdn.microsoft.com/en-us/library/dn314429(v=113).aspx)。 –