Moq Parent没有默认构造函数。必须显式定义默认构造函数

时间:2014-06-03 11:47:05

标签: asp.net entity-framework testing moq

我正在使用实体框架db first方法并生成edmx文件。

我正在尝试使用enter code here框架实现MOQ单元测试。

这是我的代码

[TestMethod]
    public void DeleteApplication()
    {
        var mockContext = new Mock<ARMSContext>();
        var data = GetMemoryApplications();
        var mockSet = new Mock<DbSet<Application>>();
        mockSet.As<IQueryable<Application>>().Setup(m => m.Provider).Returns(data.Provider);
        mockSet.As<IQueryable<Application>>().Setup(m => m.Expression).Returns(data.Expression);
        mockSet.As<IQueryable<Application>>().Setup(m => m.ElementType).Returns(data.ElementType);
        mockSet.As<IQueryable<Application>>().Setup(m => m.GetEnumerator()).Returns(data.GetEnumerator());

        var test=appcontroller.Delete(1, 1);

    }

我在调用Parent does not have..时收到mockSet.Object个异常。

你能解决这个例外吗?

1 个答案:

答案 0 :(得分:1)

根据您提供的内容,我无法看到您使用Mock<DbSet<Application>>的方式,也看不到Mock<ARMSContext>

以下是MSDN“Testing with a mocking framework (EF6 onwards)”提供的示例,它将DbSet挂钩到Context

    [TestMethod]
    public void GetAllBlogs_orders_by_name()
    {
        var data = new List<Blog>
        {
            new Blog { Name = "BBB" },
            new Blog { Name = "ZZZ" },
            new Blog { Name = "AAA" },
        }.AsQueryable();

        var mockSet = new Mock<DbSet<Blog>>();
        mockSet.As<IQueryable<Blog>>().Setup(m => m.Provider).Returns(data.Provider);
        mockSet.As<IQueryable<Blog>>().Setup(m => m.Expression).Returns(data.Expression);
        mockSet.As<IQueryable<Blog>>().Setup(m => m.ElementType).Returns(data.ElementType);
        mockSet.As<IQueryable<Blog>>().Setup(m => m.GetEnumerator()).Returns(data.GetEnumerator());

        var mockContext = new Mock<BloggingContext>();
        mockContext.Setup(c => c.Blogs).Returns(mockSet.Object);

        var service = new BlogService(mockContext.Object);
        var blogs = service.GetAllBlogs();

        Assert.AreEqual(3, blogs.Count);
        Assert.AreEqual("AAA", blogs[0].Name);
        Assert.AreEqual("BBB", blogs[1].Name);
        Assert.AreEqual("ZZZ", blogs[2].Name);
    }
}