C# 使用Moq Mock对象模拟DbContext而不声明接口

C# 使用Moq Mock对象模拟DbContext而不声明接口,c#,unit-testing,moq,C#,Unit Testing,Moq,我有一个EFDbContext,它声明实体框架数据库上下文 我不需要它的接口,但我显然是被Moq强迫只能模拟接口 有没有一种方法可以模拟一个具体的方法,而只是把它当作一个接口 密码正在被破解: [TestClass] public class EFBlogRepositoryTest { [TestMethod] public void Test_GetAllBlogs() { // Arrange DateTime now = Date

我有一个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());
    }
}

不,不是这样的。模拟对象是接口的部分实现,作为实际实现的替代

所以当你说

我不需要它的接口


。。。现在可以了。

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

所以,你要么需要一个你应该做的接口,要么如果你真的,真的不想,那么你可以将.blog声明为虚拟的


请注意,要设置属性,应该使用.SetupGet,而不是设置。

太好了,谢谢。。。我只是想知道你是否可以强制模拟对象读起来就像它是一个接口。。。Mock是开源的吗?如果是这样的话,可能值得为它创建一个方法来读取属性并在运行中创建一个接口或类似的东西吗?感谢SetupGet部分。