Я работаю с .NET 4.5, EF6, и я пытаюсь использовать JustMock 2.0 для тестирования моего применениеJustMock - Как издеваться над методом для всех экземпляров, возвращая результат эквивалентного метода другого класса (общий общий интерфейс
Я пытаюсь дразнить свою базу данных, насмехаясь над моим DbContext подкласса:.. CoreDataRepositoryContext
чтобы сделать это, мне нужно издеваться члену SaveChanges из DbContext и каждый DbSet напечатал свойства моего класса CoreDataRepositoryContext, возвратив поддельный сбор данных. Мне также нужно издеваться следующие членов DbSet «s:
- Добавить
- Удалить
- AsQueryable
мне нужно издеваться над его для всех экземпляров CoreDataRepositoryContext и DbSet
Например, у меня есть en Tities типа Заказать в базе данных (таблица Заказы) я сделал следующее издеваться за столом Заказы:
// FakeOrders is a list of orders (List<Order>)
var mockedContext = Mock.Create<CoreDataRepositoryContext>();
// Mock works
Mock.Arrange(() => mockedContext.SaveChanges()).IgnoreInstance().DoNothing();
// Mock works
Mock.Arrange(() => mockedContext.Orders).IgnoreInstance().ReturnsCollection(FakeOrders);
// Mock works
Mock.Arrange(() => mockedContext.Orders.Add(Arg.IsAny<Order>())).IgnoreInstance().DoInstead((Order o) => FakeOrders.Add(o));
// Mock works
Mock.Arrange(() => mockedContext.Orders.Remove(Arg.IsAny<Order>())).IgnoreInstance().DoInstead((Order o) => FakeOrders.Remove(o));
// Mock DOES NOT work !
Mock.Arrange(() => mockedContext.Orders.AsQueryable()).IgnoreInstance().Returns(() => FakeOrders.AsQueryable());
mockedContext.Orders имеет тип DbSet < Order> и FakeOrders имеет тип Список < Заказ>. Оба класса реализуют интерфейс IEnumerable < Заказ>.
Дразнящий Добавить и Удалить пользователей работают хорошо, потому что ни один из двух методов объявлен в интерфейсе IEnumerable < T>.
С другой стороны, AsQueryable объявляется в этом интерфейсе и определяется Queryable. Итак, как я дразнить член, используя IgnoreInstance, вызывая AsQueryable из экземпляра любого класса, который реализует IEnumerable < T> запускает бесконечный цикл. Поскольку IEnumerable < Order> .AsQueryable издевались над FakeOrders.AsQueryable который осмеян ... FakeOrders.AsQueryable ... бесконечный цикл ...
var query = mockedContext.Orders.AsQueryable(); // Infinite loop
query = FakeOrders.AsQueryable(); // Infinite loop
query = new List<Order>().AsQueryable(); // Infinite loop
Как я могу сделать, чтобы только макет DbSet < Заказать>.AsQueryable конкретно, без насмешек IEnumerable < Заказать> .AsQueryable используя IgnoreInstance?
Спасибо за вашу помощь :)
Возможно, вы захотите попробовать [JustMock.EntityFramework] (http://www.nuget.org/packages/JustMock.EntityFramework/), чтобы сэкономить много работы. –