【问题标题】:Mocking DbContext with Moq Mock object without declaring interface在不声明接口的情况下使用 Moq Mock 对象模拟 DbContext
【发布时间】:2015-06-17 13:36:01
【问题描述】:

我有一个声明实体框架数据库上下文的 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());
    }
}

【问题讨论】:

    标签: c# unit-testing moq


    【解决方案1】:

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

    所以当你说

    我不需要它的接口

    ...你现在就做。

    【讨论】:

    • 太好了,谢谢...我只是想知道您是否可以强制 Mock 对象像接口一样读取... Mock 是开源的吗?如果是这样,可能值得为它创建一个方法来读取属性并在旅途中创建一个接口或类似的东西?
    【解决方案2】:

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

    因此,您要么需要一个界面(这是您应该做的),或者如果您真的、真的不想,那么您可以将 .Blogs 声明为虚拟的。

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

    【讨论】:

    • 感谢 SetupGet 部分。
    猜你喜欢
    • 2011-11-20
    • 1970-01-01
    • 1970-01-01
    • 2010-10-16
    • 1970-01-01
    • 2020-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多