Я понимаю, что это старая ветка, но все равно хотел опубликовать ответ.
Следующее решение сделано с использованием Шимс
Я не уверен, какие версии (2013, 2012, 2010), а также варианты (экспресс, про, премиум, окончательный) комбинаций Visual Studio позволяет вам использовать Shims, так что это может быть доступно не всем.
Вот код, который ОП опубликовал
// some method that returns some testable result
public object ExecuteSomething(SearchOptions searchOptions)
{
// some other preceding code
if (searchOptions.Date.HasValue)
query = query.Where(c =>
EntityFunctions.TruncateTime(c.Date) == searchOptions.Date);
// some other stuff and then return some result
}
Следующее будет находиться в каком-то проекте модульного тестирования и в некотором файле модульного теста. Вот модульный тест, который будет использовать Шимс.
// Here is the test method
public void ExecuteSomethingTest()
{
// arrange
var myClassInstance = new SomeClass();
var searchOptions = new SearchOptions();
using (ShimsContext.Create())
{
System.Data.Objects.Fakes.ShimEntityFunctions.TruncateTimeNullableOfDateTime = (dtToTruncate)
=> dtToTruncate.HasValue ? (DateTime?)dtToTruncate.Value.Date : null;
// act
var result = myClassInstance.ExecuteSomething(searchOptions);
// assert
Assert.AreEqual(something,result);
}
}
Я полагаю, что это, вероятно, самый чистый и самый ненавязчивый способ тестирования кода, который использует EntityFunctions без генерации этого NotSupportedException.
Возможно, имена путей могут быть одинаковыми. Вы можете проверить заголовок Accept на предмет mime-типа желаемого ответа вашего клиента, а затем вернуть соответствующее представление на основе того, что вы там найдете:
Браузеры устанавливают для этого поля значение HTML; ваши клиенты JSON просто установят это поле соответствующим образом.
Я использую соглашение
/things/list -- HTML
/things/_listpage -- AJAX
. Правило состоит в том, что все действия / представления с использованием AJAX имеют начальное подчеркивание. Это говорит мне о том, что они никогда не называются верхним уровнем и обычно не имеют связанной главной страницы. В этом случае я сохраняю действие под одним и тем же контроллером, чтобы совместно использовать любую связанную логику.
Обычно в представлении списка у меня будет
<% RenderAction("_listpage", "things", new {page = ViewData["CURRENT_PAGE"]}); %>
Маловероятно, что кто-то будет добавлять в закладки URL-адрес, запрашивающий JSON, поэтому я думаю, что не так важно поддерживать этот URL в чистоте. Он также может быть создан программно, а не вручную. Учитывая это, я бы подумал о добавлении его в качестве параметра запроса.
/things/list -- HTML
/things/list?format=json -- JSON
Это не повредит ваши URL-адреса, если у вас есть параметры идентификатора или вам также нужны другие параметры. Он также мог работать с POST и GET.
/things/1 -- HTML for "thing 1"
/things/1?format=json -- JSON for "thing 1"