Состояние тестирования в S#arp Architecture - лучшие практики

Как проверить состояние в проекте S#arp Architecture?

Например, у меня есть собственный RoleProvider. Я хочу проверить метод provider.AddUsersToRoles(string[], string[]).

Итак, я начну с:

// Arrange
const string ficticiousRole = "Management";
var userToExpect = UserInstanceFactory.CreateValidTransientUser();
var roleToExpect = RoleInstanceFactory.CreateValidTransientRole();

userRepository.Expect(r => r.GetByUsername(userToExpect.Username))
              .Return(userToExpect);
roleRepository.Expect(r => r.GetByName(ficticiousRole))
              .Return(roleToExpect);

var userNames = new List<string>();
var roleNames = new List<string>();
userNames.Add(userToExpect.Username);
roleNames.Add(ficticiousRole);

Затем я добавляю пользователя в роль. Затем я проверяю, входит ли пользователь в эту роль.

// Act
roleProvider.AddUsersToRoles(userNames.ToArray(), roleNames.ToArray());
var isNewUserInRole = roleProvider.IsUserInRole(userToExpect.Username, ficticiousRole);

// Assert
Assert.IsTrue(isNewUserInRole);

Проблема в том, что я использую Rhino Mocks. У меня ограниченные знания о Rhino Mocks, но, насколько я понимаю (согласно Ayende Rahien), вы используете Rhino Mocks для проверки работоспособности, а не состояния.

Итак, я думаю, что SqlLite DB в памяти будет более подходящим? Какой лучший способ сделать это в S#arp Arch?

2 ответа

Решение

Вы не можете сделать это с помощью Rhino Mocks, поскольку это просто фальшивый фреймворк, который подделывает такие вещи, как вызовы базы данных и т. Д. Похоже, вы действительно хотите проверить постоянство базы данных, что в основном является тестированием интеграции базы данных. В этом случае вы, безусловно, захотите использовать базу данных в памяти, такую ​​как SqlLite (если возможно!), А не попадать в экземпляр SQL Server.

Что вы хотите сделать, так это в начале каждого теста или тестового класса разбить базу данных, если она уже существует, перестроить базу данных, заполнить базу данных некоторыми начальными данными, а затем протестировать взаимодействие с базой данных. Таким образом, вы можете убедиться, что у вас есть известное состояние базы данных перед каждым тестом.

Одна вещь, которую я сделал в проекте, сгруппировала все мои тесты, доступные только для чтения, в один тестовый класс, так что мне пришлось сделать шаг перестройки базы данных только один раз для класса и переместить все мои тесты удаления, обновления и вставки в другие тестовые классы, которые перестроить базу данных перед каждым тестом. При наличии достаточного количества тестов это может занять довольно много времени и может потребоваться перенести на сервер CI.

Не видя остальную часть вашего кода, было бы трудно ответить на это.

Другие вопросы по тегам