Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
ASP.NET WebAPI & Юнит тестирование и тип SingleResult
|
|||
|---|---|---|---|
|
#18+
У меня есть следующий метод в моем классе BaseApiController: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. Я использую SingleResult для OData запроса (потому что $expand расширяться одной записи не работает, если я не создать SingleResult). Но теперь у меня есть проблемы с юнит тестами метода на конкретном контроллере (например AddressApiController). Я всегда получаю NULL в результате: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. Я проверил и продебагал GetByID () и выяснил, что repository.Table.Where (т => == t.ID ID)) возвращает правильное значение, но после SingleResult.Create я получаю NULL. Как я могу решить эту проблему? Как прочитать содержимое из SingleResult? Зарание благодарен ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.10.2015, 18:11 |
|
||
|
ASP.NET WebAPI & Юнит тестирование и тип SingleResult
|
|||
|---|---|---|---|
|
#18+
какая-то жесть ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.10.2015, 21:32 |
|
||
|
ASP.NET WebAPI & Юнит тестирование и тип SingleResult
|
|||
|---|---|---|---|
|
#18+
Да, но по другому не получаеться. Все работало отлично пока SingleResult не добавили. А без него не работает $expand. Может подскажете другое решение? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.10.2015, 21:39 |
|
||
|
ASP.NET WebAPI & Юнит тестирование и тип SingleResult
|
|||
|---|---|---|---|
|
#18+
а что тестирует ваш тест? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.10.2015, 21:45 |
|
||
|
ASP.NET WebAPI & Юнит тестирование и тип SingleResult
|
|||
|---|---|---|---|
|
#18+
kmaw, В даном примере только метод GetByID, но есть много других тестов где используется controller.GetById(1); например в тесте Can_Insert_Address. Но впрочем это не важно так как на данный момент controller.GetById(1); возващает толко NULL. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.10.2015, 23:46 |
|
||
|
ASP.NET WebAPI & Юнит тестирование и тип SingleResult
|
|||
|---|---|---|---|
|
#18+
RomaMarusyk, в вашем тесте нет инициализации переменной repository. она используется в вашем методе return Request.CreateResponse(HttpStatusCode.OK, SingleResult.Create(repository.Table.Where(t => t.ID == id))); и если вы хотите покрыть ваш метод тестами то необходимо проинициализировать repository moq объектом ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2015, 13:01 |
|
||
|
ASP.NET WebAPI & Юнит тестирование и тип SingleResult
|
|||
|---|---|---|---|
|
#18+
monstrU, ну порстите что я не скинул все 845 строк кода сюда. если внимателно посмотреть то в первом сообщение в втором примере есть строка var controller = new AddressApiController(moq); я же говорю что все работало пока не добавили SingleResult. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2015, 15:02 |
|
||
|
ASP.NET WebAPI & Юнит тестирование и тип SingleResult
|
|||
|---|---|---|---|
|
#18+
RomaMarusykmonstrU, ну порстите что я не скинул все 845 строк кода сюда. если внимателно посмотреть то в первом сообщение в втором примере есть строка var controller = new AddressApiController(moq); я же говорю что все работало пока не добавили SingleResult. Тогда у вас нет понимания того. что вы тестируете. что запуститься, когда вы в тесте выполните HttpResponseMessage response = controller.GetById(1); ? будет вызвана реальная реализация repository.GetById(id)? зачем? я и пишу, что тут должна быть вызван moq объект repository, а не использована реальная реализация. брать отсюда ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2015, 16:20 |
|
||
|
ASP.NET WebAPI & Юнит тестирование и тип SingleResult
|
|||
|---|---|---|---|
|
#18+
monstrU, во первых, зачем создавать 2 отдельных репозитория? Ну допустим, я создал "moq объект repository" и теститую его, тогда как тестировать реальний репозиторий? но впрочем дело не в этом я имею понимания того что тестирую. а ви кажется не поняли вопрос. я не спрашивал как мне создать объект репозитория и вызвать метод, с этим и так все в порядке и оно было в рабочем состояние и написано было давно. При добавление SingleResult возникла проблема. и вопрос именно об этом а не о том использовать мне реальную реализацию репизотория или нет. до добавление этой строки "SingleResult.Create(" все тести проходили успешно и все так как било указано в ТЗ. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2015, 17:43 |
|
||
|
ASP.NET WebAPI & Юнит тестирование и тип SingleResult
|
|||
|---|---|---|---|
|
#18+
у вас не тестируемая мешанина. HttpResponseMessage и репозиторий - это абстракции разных уровней. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2015, 17:59 |
|
||
|
ASP.NET WebAPI & Юнит тестирование и тип SingleResult
|
|||
|---|---|---|---|
|
#18+
короче, ваш тест проявил свою нужность: он показал, что надо все рефакторить ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2015, 18:01 |
|
||
|
ASP.NET WebAPI & Юнит тестирование и тип SingleResult
|
|||
|---|---|---|---|
|
#18+
возможно, да скорее всега да. что посоветуете? с чего начать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2015, 20:13 |
|
||
|
ASP.NET WebAPI & Юнит тестирование и тип SingleResult
|
|||
|---|---|---|---|
|
#18+
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 большого смысла не имеет, так как стоит рассчитывать на то, что база извлекает корректно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2015, 13:55 |
|
||
|
|

start [/forum/topic.php?fid=18&msg=39085235&tid=1356177]: |
0ms |
get settings: |
10ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
31ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
36ms |
get tp. blocked users: |
1ms |
| others: | 226ms |
| total: | 331ms |

| 0 / 0 |
