Как использовать Moq и DbFunctions в модульных тестах, чтобы предотвратить исключение NotSupportedException?

В настоящее время я пытаюсь запустить некоторые модульные тесты для запроса, который выполняется через Entity Framework. Сам запрос выполняется без каких-либо проблем в реальной версии, но модульные тесты всегда дают сбой.

Я сузил это до моего использования 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, все тесты пройдут (за исключением тех, которые проверяют, что выполняются только действительные результаты для данной даты).

Есть ли способ, которым я могу предоставить поддельную версию 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-сервер).

Ответы на вопрос(7)

Ваш ответ на вопрос