0
DbSetの変更を保存するための単体テストを作成しています。基礎となるエンティティの更新機能をテストするためにDbSetを正しくロックできません
PreSchoolContext
DbSet<Student> Students{get;set;}
PreSchoolRepository
EDIT:PreSchoolContextは、依存性注入スルー扱い、今IPreSchoolContextインスタンスであるコードは次のようになります。
public async Task<int> UpdatePreSchoolStudentAsync(Student student)
{
PreSchoolContext.Set<Student>().AddOrUpdate(student);
var result = await PreSchoolContext.SaveChangesAsync().ConfigureAwait(false);
return result;
}
試験方法
//Arrange
var data = GetStudents().AsQueryable();
var mockSet = new Mock<DbSet<Student>>();
mockSet.As<IQueryable<Student>>().Setup(m => m.Provider).Returns(new TestDbAsyncQueryProvider<Student>(data.Provider));
mockSet.As<IQueryable<Student>>().Setup(m => m.Expression).Returns(data.Expression);
var preSchoolContextMock = new Mock<IPreSchoolContext>();
preSchoolContextMock.Setup(c => c.Students).Returns(mockSet.Object);
var repo = new PreSchoolRepository(preSchoolContextMock.Object);
//Act
var preSchoolStudentUpdateFlag = await repo.UpdatePreSchoolStudentAsync(data.FirstOrDefault());
//Assert
preSchoolStudentUpdateFlag.ShouldNotBeNull();
preSchoolStudentUpdateFlag.ShouldBe(1);
エラー
由来IDbSetタイプ 'Castle.Proxies.DbSet`1Proxy' 上公共、インスタンスメソッドAddOrUpdateを呼び出すことができません。メソッドが見つかりません。
模擬データを正しく設定するために欠けているものを理解できません。
なぜ私たちは制御できないコードをテストしようとしますか? MSはリリース前にコードをテストしていたでしょう。つまり、テストしているメソッドが密接に結合されているため、それを独立してテストすると意味のある目的を果たせません。 – Nkosi
テスト中のクラスが実際の 'PreSchoolContext'を' new'して使用しています。 dbcontextを模倣するために、ある種の依存性注入が必要です。 – AndrewP
@AndrewP、更新されたコード。依存性注入による処理。 – Kenz