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, а не программу установки.

Другие вопросы по тегам