Соглашения о присвоении имен MVC для действий JSON

Я понимаю, что это старая ветка, но все равно хотел опубликовать ответ.

Следующее решение сделано с использованием Шимс

Я не уверен, какие версии (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.

6
задан Peter Bratton 17 August 2016 в 16:01
поделиться

3 ответа

Возможно, имена путей могут быть одинаковыми. Вы можете проверить заголовок Accept на предмет mime-типа желаемого ответа вашего клиента, а затем вернуть соответствующее представление на основе того, что вы там найдете:

  • application / json: JSON View
  • text / xml: XML View
  • текст / обычный, текст / HTML: JSP View

Браузеры устанавливают для этого поля значение HTML; ваши клиенты JSON просто установят это поле соответствующим образом.

15
ответ дан 8 December 2019 в 14:46
поделиться

Я использую соглашение

/things/list -- HTML
/things/_listpage -- AJAX

. Правило состоит в том, что все действия / представления с использованием AJAX имеют начальное подчеркивание. Это говорит мне о том, что они никогда не называются верхним уровнем и обычно не имеют связанной главной страницы. В этом случае я сохраняю действие под одним и тем же контроллером, чтобы совместно использовать любую связанную логику.

Обычно в представлении списка у меня будет

<% RenderAction("_listpage", "things", new {page = ViewData["CURRENT_PAGE"]}); %>
1
ответ дан 8 December 2019 в 14:46
поделиться

Маловероятно, что кто-то будет добавлять в закладки 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"
1
ответ дан 8 December 2019 в 14:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: