首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在单元测试中使用Moq和DbFunctions来防止NotSupportedException?

如何在单元测试中使用Moq和DbFunctions来防止NotSupportedException?
EN

Stack Overflow用户
提问于 2014-01-28 22:06:29
回答 7查看 10.1K关注 0票数 33

我目前正在尝试对通过实体框架运行的查询运行一些单元测试。查询本身在活动版本上运行没有任何问题,但是单元测试总是失败。

我已经将范围缩小到使用DbFunctions.TruncateTime,但我不知道有什么方法可以让单元测试反映实时服务器上正在发生的事情。

下面是我使用的方法:

    public System.Data.DataTable GetLinkedUsers(int parentUserId)
    {
        var today = DateTime.Now.Date;

        var query = from up in DB.par_UserPlacement
                    where up.MentorId == mentorUserId
                        && DbFunctions.TruncateTime(today) >= DbFunctions.TruncateTime(up.StartDate)
                        && DbFunctions.TruncateTime(today) <= DbFunctions.TruncateTime(up.EndDate)
                    select new
                    {
                        up.UserPlacementId,
                        up.Users.UserId,
                        up.Users.FirstName,
                        up.Users.LastName,
                        up.Placements.PlacementId,
                        up.Placements.PlacementName,
                        up.StartDate,
                        up.EndDate,
                    };

        query = query.OrderBy(up => up.EndDate);

        return this.RunQueryToDataTable(query);
    }

如果我注释掉带有DbFunctions in的行,所有测试都会通过(除了那些检查是否只运行了给定日期的有效结果的测试)。

有没有一种方法可以让我在这些测试中使用DbFunctions.TruncateTime的模拟版本?从本质上讲,它应该只返回Datetime.Date,但这在EF查询中不可用。

编辑:下面是使用日期检查失败的测试:

    [TestMethod]
    public void CanOnlyGetCurrentLinkedUsers()
    {
        var up = new List<par_UserPlacement>
        {
            this.UserPlacementFactory(1, 2, 1), // Create a user placement that is current
            this.UserPlacementFactory(1, 3, 2, false) // Create a user placement that is not current
        }.AsQueryable();

        var set = DLTestHelper.GetMockSet<par_UserPlacement>(up);

        var context = DLTestHelper.Context;
        context.Setup(c => c.par_UserPlacement).Returns(set.Object);

        var getter = DLTestHelper.New<LinqUserGetLinkedUsersForParentUser>(context.Object);

        var output = getter.GetLinkedUsers(1);

        var users = new List<User>();
        output.ProcessDataTable((DataRow row) => students.Add(new UserStudent(row)));

        Assert.AreEqual(1, users.Count);
        Assert.AreEqual(2, users[0].UserId);
    }

编辑2:这是来自相关测试的消息和调试跟踪:

Test Result: Failed

Message: Assert.AreEqual failed. Expected:<1>. Actual:<0>

Debug Trace: This function can only be invoked from LINQ to Entities

据我所知,这是因为没有此方法的LINQ to Entities实现可在此用于单元测试,尽管在活动版本上有(因为它正在查询SQL服务器)。

EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21407748

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档