Подумайте, как это работает ... вы говорите своей системе создать книгу с идентификатором 1000. вы запускаете свой метод, теперь в базе данных существует книга с идентификатором 1000. Затем вы снова запускаете метод, и он терпит неудачу, потому что, очевидно, ваша книга с идентификатором 1000 все еще находится в базе данных.
Далее вы издеваетесь над слоем базы данных и создаете сущность с идентификатором 1000 и никогда не избавляетесь от него. В следующий раз, когда вы запустите свой метод, вы, вероятно, получите проблемы с отслеживанием сущностей.
Эта вещь, которую вы называете тестом, на самом деле не является тестом, потому что нет утверждения, вы ничего не проверяете, поэтому не тест.
Это все очень сложно и неизбежно может привести к потере волос. То, что вы пытаетесь сделать, говорит мне о том, что вы действительно хотите интеграционные тесты, а не модульные тесты.
Если вы хотите модульные тесты, я бы сказал, взять EF из них и сосредоточиться на реальной функциональности, такой как бизнес-правила и * 1048. *.
Наличие интеграционных тестов - это неплохо, но если вы создаете реальные данные, в конце вызова вы также должны их очистить.
Реальный интеграционный тест будет выглядеть так:
- создать тестовую книгу в db
- выдать и проверить, что данные именно такие, как вы ожидаете, используя правильный Assert утверждения между вашими ожидаемыми данными и фактическими данными.
так:
- создать книгу с 1000
- проверить результат вызова
- загрузите книгу с идентификатором 1000 из базы данных
- используйте подтверждения, чтобы проверить, что вас волнует
- удалите книгу с идентификатором 1000 и все связанные данные из базы данных
нормальный поток для интеграционного теста.
Как правило, когда вы создаете данные, вы не должны сообщать своей базе данных, какой идентификатор использовать, позволить ей вставить запись и сказать, что такое уникальный идентификатор. Это решает ряд проблем, включая множественные вызовы одновременно. Не используйте функцию max в столбце для определения следующего идентификатора, который имеет проблемы с параллелизмом.
В зависимости от вашей системы, может быть лучше пометить поле идентификатора в db как идентификатор и автоинкремент, и тогда ваш ORM увидит это, и ваши слои изменятся, поэтому теперь вы не можете указывать идентификатор, когда пытаюсь что-то создать.
Однако существуют ситуации, когда необходимо указать идентификатор, и в этом случае можно использовать что-то вроде уникального идентификатора, в частности, GUID. У этого очень низкий шанс столкновения.
Я бы сказал, подумайте, что вы пытаетесь проверить. Да, вы можете издеваться над своими репозиториями и т.д. c, но если вы издеваетесь над ними, то что вы тестируете? если вы хотите проверить, правильно ли созданы ваши предметы, вам нужно go до базы данных, потому что никакие насмешки не помогут вам в этом. Вы также можете использовать базу данных в памяти, чтобы ускорить процесс и не затрагивать реальную базу данных.
Но факт остается фактом: модульные тесты связаны с функциональностью, проверкой преобразований данных и т. Д. c. Чем меньше насмешек вы можете сделать, тем лучше ваши тесты, особенно когда вы реорганизуете код.
Кроме того, старайтесь избегать ORM, если можете, думайте о вещах функционально. Вот некоторые данные, я вызываю этот метод, я должен получить этот результат. Это было бы уместно для юнит-теста.