Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / ASP.NET WebAPI & Юнит тестирование и тип SingleResult / 14 сообщений из 14, страница 1 из 1
22.10.2015, 18:11
    #39084003
RomaMarusyk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ASP.NET WebAPI & Юнит тестирование и тип SingleResult
У меня есть следующий метод в моем классе BaseApiController:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
public virtual HttpResponseMessage GetById(int id)
{
   var entity = repository.GetById(id);

   if (entity == null)
   {                
     var message = string.Format("No {0} with ID = {1}", GenericTypeName, id);
     return ErrorMsg(HttpStatusCode.NotFound, message);
   }

   return Request.CreateResponse(HttpStatusCode.OK, SingleResult.Create(repository.Table.Where(t => t.ID == id)));
}


Я использую SingleResult для OData запроса (потому что $expand расширяться одной записи не работает, если я не создать SingleResult).
Но теперь у меня есть проблемы с юнит тестами метода на конкретном контроллере (например AddressApiController). Я всегда получаю NULL в результате:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
[TestMethod]
public void Get_By_Id()
{
    //Arrange
    var moq = CreateMockRepository();
    var controller = new AddressApiController(moq);
    controller.Request = new HttpRequestMessage()
    controller.Request.SetConfiguration(new HttpConfiguration())
    // Action
    HttpResponseMessage response = controller.GetById(1);
    var result = response.Content.ReadAsAsync<T>().Result;

    // Accert
    Assert.IsNotNull(result);
} 



Я проверил и продебагал GetByID () и выяснил, что repository.Table.Where (т => == t.ID ID)) возвращает правильное значение, но после SingleResult.Create я получаю NULL.

Как я могу решить эту проблему? Как прочитать содержимое из SingleResult?

Зарание благодарен
...
Рейтинг: 0 / 0
22.10.2015, 21:32
    #39084129
kmaw
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ASP.NET WebAPI & Юнит тестирование и тип SingleResult
какая-то жесть
...
Рейтинг: 0 / 0
22.10.2015, 21:39
    #39084134
RomaMarusyk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ASP.NET WebAPI & Юнит тестирование и тип SingleResult
Да, но по другому не получаеться. Все работало отлично пока SingleResult не добавили. А без него не работает $expand. Может подскажете другое решение?
...
Рейтинг: 0 / 0
22.10.2015, 21:45
    #39084135
kmaw
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ASP.NET WebAPI & Юнит тестирование и тип SingleResult
а что тестирует ваш тест?
...
Рейтинг: 0 / 0
22.10.2015, 23:46
    #39084193
RomaMarusyk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ASP.NET WebAPI & Юнит тестирование и тип SingleResult
kmaw,
В даном примере только метод GetByID, но есть много других тестов где используется controller.GetById(1); например в тесте Can_Insert_Address. Но впрочем это не важно так как на данный момент controller.GetById(1); возващает толко NULL.
...
Рейтинг: 0 / 0
23.10.2015, 13:01
    #39084636
monstrU
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ASP.NET WebAPI & Юнит тестирование и тип SingleResult
RomaMarusyk,

в вашем тесте нет инициализации переменной repository.
она используется в вашем методе
return Request.CreateResponse(HttpStatusCode.OK, SingleResult.Create(repository.Table.Where(t => t.ID == id)));
и если вы хотите покрыть ваш метод тестами то необходимо проинициализировать repository moq объектом
...
Рейтинг: 0 / 0
23.10.2015, 15:02
    #39084908
RomaMarusyk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ASP.NET WebAPI & Юнит тестирование и тип SingleResult
monstrU,

ну порстите что я не скинул все 845 строк кода сюда.
если внимателно посмотреть то в первом сообщение в втором примере есть строка var controller = new AddressApiController(moq);
я же говорю что все работало пока не добавили SingleResult.
...
Рейтинг: 0 / 0
23.10.2015, 16:20
    #39085057
monstrU
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ASP.NET WebAPI & Юнит тестирование и тип SingleResult
RomaMarusykmonstrU,

ну порстите что я не скинул все 845 строк кода сюда.
если внимателно посмотреть то в первом сообщение в втором примере есть строка var controller = new AddressApiController(moq);
я же говорю что все работало пока не добавили SingleResult.

Тогда у вас нет понимания того. что вы тестируете.
что запуститься, когда вы в тесте выполните
HttpResponseMessage response = controller.GetById(1); ?

будет вызвана реальная реализация repository.GetById(id)?
зачем?

я и пишу, что тут должна быть вызван moq объект repository, а не использована реальная реализация.
брать отсюда
...
Рейтинг: 0 / 0
23.10.2015, 17:43
    #39085220
RomaMarusyk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ASP.NET WebAPI & Юнит тестирование и тип SingleResult
monstrU,
во первых, зачем создавать 2 отдельных репозитория? Ну допустим, я создал "moq объект repository" и теститую его, тогда как тестировать реальний репозиторий?
но впрочем дело не в этом
я имею понимания того что тестирую. а ви кажется не поняли вопрос. я не спрашивал как мне создать объект репозитория и вызвать метод, с этим и так все в порядке и оно было в рабочем состояние и написано было давно. При добавление SingleResult возникла проблема. и вопрос именно об этом а не о том использовать мне реальную реализацию репизотория или нет. до добавление этой строки "SingleResult.Create(" все тести проходили успешно и все так как било указано в ТЗ.
...
Рейтинг: 0 / 0
23.10.2015, 17:59
    #39085235
kmaw
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ASP.NET WebAPI & Юнит тестирование и тип SingleResult
у вас не тестируемая мешанина. HttpResponseMessage и репозиторий - это абстракции разных уровней.
...
Рейтинг: 0 / 0
23.10.2015, 18:01
    #39085239
kmaw
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ASP.NET WebAPI & Юнит тестирование и тип SingleResult
короче, ваш тест проявил свою нужность: он показал, что надо все рефакторить
...
Рейтинг: 0 / 0
23.10.2015, 20:13
    #39085326
RomaMarusyk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ASP.NET WebAPI & Юнит тестирование и тип SingleResult
возможно, да скорее всега да. что посоветуете? с чего начать?
...
Рейтинг: 0 / 0
26.10.2015, 13:55
    #39086824
monstrU
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ASP.NET WebAPI & Юнит тестирование и тип SingleResult
RomaMarusyk,

ну вот вопросы по методу

начинается

public virtual HttpResponseMessage GetById(int id)
{
var entity = repository.GetById(id);


--- тут из repository получается объект entity

-- и далее проверяется объект на его наличие

if (entity == null)
{
var message = string.Format("No {0} with ID = {1}", GenericTypeName, id);
return ErrorMsg(HttpStatusCode.NotFound, message);
}


-- и тут начинается использование repository.Table
return Request.CreateResponse(HttpStatusCode.OK, SingleResult.Create(repository.Table.Where(t => t.ID == id)));
}

зачем сначала получали entity? почему его дальше не использовали?
var entity = repository.GetById(id);
repository.Table.Where(t => t.ID == id)
эти 2 метода делают одно и то же ?
выглядит что да - зачем?

про тестирование

снова задаю вопрос - вы что тестируете ?

вы хотите судя по тесту протестировать получение entity по идентификатору.
почему вы тестируете при этом метод webapi а не метод repository.GetById? ведь реально загрузкой занимается он.
будет работать метод repository.GetById - будет работать и метод webapi.

repository должен быть тестируемый - описан интерфейсами и абстрактными классами.
ваш repository.Table - это из контекста Linq, Entity ?

для тестирования repository.GetById в repository.Table нужно создать moq заглушку, которая предоставит исходные данные, а уже потом GetById будет загружать данные согласно заложенным правилам.
на момент тестирования метод repository.GetById должен срабатывать на данных, заданных в Moq, на момент реального запуска repository.GetById должен загружать из базы.

так что вы тестируете ?
обратите внимание, что извлечение записи при помощи запроса вида select * from table1 where id=123 большого смысла не имеет, так как стоит рассчитывать на то, что база извлекает корректно
...
Рейтинг: 0 / 0
26.10.2015, 13:57
    #39086828
monstrU
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ASP.NET WebAPI & Юнит тестирование и тип SingleResult
RomaMarusyk,

в тесте не надо ли писать так

var result = response.Content.ReadAsAsync<T>().ConfigureAwait(false).Result;

ведь метод ReadAsAsync асинхронный
...
Рейтинг: 0 / 0
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / ASP.NET WebAPI & Юнит тестирование и тип SingleResult / 14 сообщений из 14, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]