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