I am writing unit tests to test Save DbSet changes. Code looks like:
PreSchoolContext
DbSet<Student> Students{get;set;}
PreSchoolRepository
EDIT: PreSchoolContext is now a IPreSchoolContext instance, handled thru dependency Injection.
public async Task<int> UpdatePreSchoolStudentAsync(Student student)
{
PreSchoolContext.Set<Student>().AddOrUpdate(student);
var result = await PreSchoolContext.SaveChangesAsync().ConfigureAwait(false);
return result;
}
Test Method
//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);
Error
Unable to call public, instance method AddOrUpdate on derived IDbSet type 'Castle.Proxies.DbSet`1Proxy'. Method not found.
Unable to understand what is missing to set the mock data correctly.