Как предотвратить влияние базы данных при модульном тестировании С# MVC?

когда я применяю модульное тестирование для операций вставки, обновления и удаления. В это время запись вставляется, обновляется и удаляется в базе данных.

Как это возможно? Может ли кто-нибудь дать решение для предотвращения эффекта базы данных?

Спасибо,


person Chirag Murabiya    schedule 30.09.2015    source источник
comment
издеваться над вызовами вашей базы данных.   -  person Daniel A. White    schedule 30.09.2015
comment
@DanielA.White Нет смысла проверять тот факт, что вы можете что-то удалить из репозитория. Тестировать логику базы данных без фактической базы данных бессмысленно. Что должен сделать OP, если он действительно хочет протестировать логику БД, так это создать отдельную строку подключения для тестовой базы данных и протестировать ее.   -  person Stan    schedule 30.09.2015
comment
@Stan, это не модульный тест. это интеграционный тест.   -  person Daniel A. White    schedule 30.09.2015
comment
@DanielA.White Я знаю. Я никогда не говорил, что это должен быть модульный тест.   -  person Stan    schedule 30.09.2015
comment
@Stan, в этом вопросе есть единица слова.   -  person Daniel A. White    schedule 30.09.2015


Ответы (2)


В идеале вы должны использовать насмешки для сценариев, в которых есть взаимодействие с БД. Убедитесь, что у вас есть отдельная логика взаимодействия с базой данных, и она управляется интерфейсом. Затем вы можете создавать фиктивные объекты, в которых вы определяете ожидания своих интерфейсов взаимодействия с базой данных. Так, например, если, например, вызывается метод InsertSomething(), что должно быть возвращено из этого метода? и так далее. Делимся некоторыми ссылками на подробности о модульном тестировании и насмешках.

https://msdn.microsoft.com/en-us/library/ff650441.aspx

https://github.com/Moq/moq4

http://www.developerhandbook.com/unit-testing/writing-unit-tests-with-nunit-and-moq/

Проверка контроллера MVC завершилась неудачно с исключением ссылки NULL

В качестве другого варианта вы можете использовать отдельную реальную базу данных для целей тестирования, если необходимо выполнить тесты для базы данных. Вы также можете выполнить скрипт sql в начале и после запуска теста для заполнения и очистки данных соответственно, чтобы сохранить базу данных в первозданном виде.

person Yogi    schedule 30.09.2015

Это возможно либо путем имитации вашей базы данных (используется в модульных тестах), либо путем создания новой базы данных, используемой только для целей тестирования (интеграционные тесты). Я бы рекомендовал использовать эти два подхода вместе. Помните, что количество модульных тестов должно быть намного больше, чем интеграционных.

Вот простой пример, как имитировать базу данных (используя библиотеку Moq).

    public class HomeController : Controller
    {
        private IUserRepository _repository;
        public HomeController(IUserRepository repository)
        {
            _repository = repository;
        }

        public ActionResult AddNewUser(User newUser)
        {
            _repository.AddUser(newUser);

            return View();
        }
    }

    public interface IUserRepository
    {
        void AddUser(User newUser);
    }

    public class UserRepository : IUserRepository
    {
        private DBContext _context;
        public UserRepository(DBContext context)
        {
            _context = context;
        }

        public void AddUser(User newUser)
        {
            _context.Users.Add(newUser);
        }
    }


    [Test]
    public void ShouldMockRepository()
    {
        // Given
        var repository = new Mock<IUserRepository>();
        var controller = new HomeController(repository.Object);

        // When
        controller.AddNewUser(new User());

        // Then
        repository.Verify(r => r.AddUser(It.IsAny<User>()), Times.Once);
    }
person Miłosz Wieczorek    schedule 30.09.2015