Я погуглил это немного и действительно не нашел ответ, в котором я нуждался.
Я работаю над веб-страницей в C# с SQL Server и LINQ для клиента. Я хочу, чтобы пользователи смогли отправить сообщения друг другу. Таким образом, то, что я делаю, - то, что я модульный тест это с данными, которые на самом деле входят в базу данных.
Проблема состоит в том, что я теперь завишу от наличия по крайней мере 2 пользователей, из которых я знаю идентификатор. Кроме того, я должен вымыться после моего сам. Это приводит к довольно большим модульным тестам, которые тестируют много в одном тесте.
Позволяет говорят, что я хотел бы обновить пользователя. Это означало бы, что я буду иметь к ceate пользователя, обновлю его и затем удалю его. Это много утверждений в одном модульном тесте и если это перестало работать с обновлением, я должен вручную удалить его.
Если бы я сделал бы это какой-либо другой путь, не сохраняя данные к DB, я наверняка не смог бы знать, что данные присутствовали в базе данных после обновления и т.д.
Что надлежащий путь состоит в том, чтобы сделать это, не имея теста, который тестирует большую функциональность в одном тесте?
Выполните все проверки внутри блока System.Transactions.TransactionScope и просто не вызывайте Scope.Complete () ... Все изменения будут отменены при выходе, и другие пользователи не смогут видеть временные данные, которые вы создаете в базе данных, поэтому процесс тестирования повлияет только на тестовую машину.
Вы можете ввести нового пользователя, прочитать базу данных, чтобы проверить что он был введен правильно, и все, что вам нужно проверить в блоке TransactionScope ...
Попросите метод единого модульного тестирования олицетворять двух разных пользователей, все в одной транзакции ...
например код
using (var scop = new System.Transactions.TransactionScope())
{
// all your test code and Asserts that access the database,
// writes and reads, from any class, ...
// to commit at the very end of this block,
// you would call
// scop.Complete(); // ..... but don't and all will be rolled back
}
Базы данных модульного тестирования могут быть PITA из-за самой их природы (постоянное хранилище).
Чтобы сделать это правильно, вы всегда должны начинать с пустой схемы. Затем попросите вашу тестовую загрузку кода заполнить значения данных, которые должны быть там. Это может быть так же просто, как просто выполнить sql-скрипт, который содержит схему и данные по умолчанию.
Как только это будет сделано, приступайте к выполнению тестов. Тесты должны охватывать все грубые операции, которые обычно выполняет ваше приложение.
Если произойдет какой-либо сбой, это не так уж важно, потому что, опять же, вы должны начинать каждый раз с нуля в любом случае.
Кроме того, вы хотите сохранить эти данные на случай сбоя тестирования, чтобы вы могли проверить состояние базы данных на момент сбоя. Так что это и хорошо, и плохо.
Таким образом, тесты db должны выполняться на собственном экземпляре тестовой базы данных. Таким образом, вам не нужно беспокоиться о временных проблемах, например о том, что кто-то меняет структуру базы данных под вами по мере выполнения тестов.
В конечном счете, тестирование базы данных - это отдельный проект.
Имейте файл фикстур (в XML, SQL, YAML и т. Д.), Который вы можете загрузить в локальную тестовую базу данных с помощью простой команды.
Например. файл фикстур для двух пользователей, которым необходимо отправлять сообщения друг другу, может выглядеть так (это мой):
Member:
Member_WibWobble:
username: Wibble_Wobble
email_address: michael+dev_wibwob@[removed].com
password: pw
is_super_admin: true
last_login: "2010-01-06 12:12:57"
Country: country_AU
UploadImage:
type: <?php echo UploadImage::TYPE_MEMBER_AVATAR."\n"; ?>
upload: "http://localhost/[removed]/images/wibwobble.jpg"
Member_BunnyHugs:
username: BunnyHugs
email_address: michael+dev_bunny@[removed].com
password: pw
is_super_admin: true
last_login: "2009-12-01 14:11:11"
Country: country_UK
UploadImage:
type: <?php echo UploadImage::TYPE_MEMBER_AVATAR."\n"; ?>
upload: "http://localhost/[removed]/images/bunnyhugs.jpg"
PrivateMessage:
PrivateMessage_1:
subject: "Yo"
body: |
hi
<b>escape this html please</b>
bye
is_read: false
Sender: Member_WibWobble
Recipient: Member_BunnyHugs