2013-11-13 2 views
2

Я выполнил ответ here, чтобы создать интерфейс для DbContext в структуре сущности. Проблема в том, что я понятия не имею, как использовать его для модульного теста. Мой контроллер, который я пытаюсь проверить, имеет два конструктора. У одного нет параметров и задается переменная экземпляра IDbContext для нового DbContext. Другой принимает IDbContext и устанавливает ту же самую переменную экземпляра. Метод я тестирую просто делает этоКак насмехаться над интерфейсом для фреймворка сущности?

return context.EntitySet<question>().ToList(); 

Ниже мой провал попытки использовать Moq и проверить работу контроллера. Я ничего не изменил в интерфейсе или частичном классе, указанном в ответе. Может, мне нужно что-то добавить?

  Mock<IDbContext> mockContext = new Mock<IDbContext>(); 
     question TestQuestion = new question { 
      Id = 1, 
      ToAsk = "Did this test work?" 
     }; 
     mockContext.Object.EntitySet<question>().Add(TestQuestion); 

     QuestionsController controller = new QuestionsController(mockContext.Object); 
     List<DHT.Entity.Models.question> questions = controller.Get(); 
     Assert.AreEqual(questions.Count, 1); 

Я довольно новичок в .NET и C#, поэтому, если я делаю все совершенно неправильно, дайте мне знать. Подход в ссылке, которую я дал, выглядел проще, чем реализация целого шаблона репозитория. Я просто пытаюсь найти самый простой способ модульного тестирования моего кода.

+0

усилию хороший инструмент модульного тестирования для EF. – Shawn

+0

Спасибо Шон, я должен посмотреть на это. Это выглядит многообещающе. – user2987995

ответ

0

Вы можете использовать FakeDbSet NuGet пакет или реализовать свой собственный класс InMemoryDbSet<T> (InMemoryDbSet<T>, который используется в фрагменте кода является один из пакета FakeDbSet):

Mock<IDbContext> mockContext = new Mock<IDbContext>(); 
question TestQuestion = new question { 
    Id = 1, 
    ToAsk = "Did this test work?" 
}; 
IDbSet<question> questions = new InMemoryDbSet<question>(true){ TestQuestion }; 
mockContext.Setup(c => c.EntitySet<question>()).Returns(questions); 

QuestionsController controller = new QuestionsController(mockContext.Object); 
List<DHT.Entity.Models.question> questions = controller.Get(); 
Assert.AreEqual(questions.Count, 1); 
+0

Спасибо! Я смог заставить это работать. По какой-то причине истинный параметр на InMemoryDbSet вызывает ссылку на нулевой объект. – user2987995

Смежные вопросы