使用 Moq 模拟对象模拟 DbContext,而不声明接口



我有一个EFDbContext,它声明了实体框架数据库上下文。

我不需要它的接口,但我显然被 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());
    }
}

不,这不是它的工作原理。模拟对象是接口的(部分)实现,作为实际实现的替代方法。

所以当你说

我不需要接口

。你现在做。

只能模拟接口上的方法/属性或类上的虚拟方法/属性。

所以,你要么需要一个接口(这是你应该做的),要么如果你真的,真的不想,那么你可以声明.博客是虚拟的。

请注意,要设置属性,您应该使用 .SetupGet,而不是安装程序。

相关内容

  • 没有找到相关文章

最新更新