Извлеките поддельный источник данных для DbSet в локальную переменную, чтобы с ним можно было взаимодействовать позже в настройках теста.Добавьте Callback
в настройку Add
, чтобы добавить переданный аргумент в источник данных, чтобы при вызове имитировались фактические данные, на которые будет воздействовать макет.
// Arrange
var data = new List<Tytul>(); //<<< local variable
Mock<DbSet<Tytul>> titlesMock = CreateDbSetMock(data);
var titlesContextMock = new Mock<OzinDbContext>();
titlesContextMock.Setup(x => x.Tytuly).Returns(titlesMock.Object);
titlesMock
.Setup(x => x.Add(It.IsAny<Tytul>()))
.Returns((Tytul t) => t)
.Callback((Tytul t) => data.Add(t)); //<<< for when mocked Add is called.
IRepository<Tytul> tytulRepository = TytulRepository(titlesContextMock.Object);
//...Code removed for brevity
Также при настройкеDbSet Mock использует делегат для Returns
, чтобы разрешить множественные перечисления, так как возвращение только значения позволит только один проход перечислителя только для пересылки.
dbSetMock.As<IQueryable<T>>()
.Setup(m => m.GetEnumerator())
.Returns(() => elementsAsQueryable.GetEnumerator()); //<<< note delegate