Mocking DbContext с Moq Mock объектом без объявления интерфейса
У меня есть EFDbContext, который объявляет контекст базы данных Entity Framework.
Мне не нужен интерфейс для него, и тем не менее Moq заставляет меня только манипулировать интерфейсами.
Есть ли способ издеваться над конкретным методом, но просто рассматривать его как интерфейс?
Код ломается:
[TestClass]
public class EFBlogRepositoryTest
{
[TestMethod]
public void Test_GetAllBlogs()
{
// Arrange
DateTime now = DateTime.Now;
var mockDbContext = new Mock<EFDbContext>();
var blogRepository = new EFBlogRepository(mockDbContext.Object);
List<Blog> blogs = new List<Blog> {
new Blog { BlogID = 1, Description = "1", Status = true, PublishDate = now },
new Blog { BlogID = 2, Description = "2", Status = true, PublishDate = now }
};
mockDbContext.Setup(c => c.Blogs).Returns(blogs); // ERROR OCCURS HERE
// Act
List<Blog> result = blogRepository.GetAllBlogs(1, 2, SortDirection.DESC, null, null).ToList();
// Assert
Assert.AreEqual(2, result.Count());
}
}
2 ответа
Нет, это не так. Макет объекта - это (частичная) реализация интерфейса в качестве альтернативы реальной реализации.
Итак, когда вы говорите,
Мне не нужен интерфейс для этого
... вы делаете сейчас.
Только метод / свойства на интерфейсах или виртуальные методы / свойства на классах могут быть смоделированы.
Итак, вам либо нужен интерфейс (что вам и нужно делать), либо, если вы действительно, действительно этого не хотите, вы можете объявить.Blogs как виртуальные.
Помните, что для установки свойства вы должны использовать.SetupGet, а не программу установки.