Как выполнить модульное тестирование функции void, которая вставляется в базу данных и сохраняет ее?

У меня есть эта функция в моем интерфейсе, и она создает новую запись PlayersBadge в базе данных. Мне нужно писать модульные тесты, и я застрял.

public void Badge(int pID, int bID, int gID = 0)
        {
            var list = EliminationDbContext.PlayerBadges.Where(x=>x.Badge.BadgeID.Equals(bID) && x.Player.PlayerID.Equals(pID));
            //if player doesn't have Badge create new Badge
            if (list.Any() != true)
            {
                PlayerBadge b = new PlayerBadge { PlayerID = pID, BadgeID = bID, DateEarned = DateTime.Today, GameID = gID };
                EliminationDbContext.PlayerBadges.Add(b);

            EliminationDbContext.SaveChanges();
        }
    }

Вы хотите имитировать базу данных или хотите проверить результат реальной вставки?

Lee 23.04.2018 16:46

Я хочу издеваться над базой данных

hmad 23.04.2018 16:49

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

Nkosi 23.04.2018 16:52

Не знаю, как бы я это сделал. Вы можете привести пример или ссылку на один?

hmad 23.04.2018 18:01
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
4
117
1

Ответы 1

У вас есть несколько вариантов. Один из них - возложить ответственность за связь с базой данных на классы репозитория и внедрить эти реализации в ваш бизнес-класс. При написании модульных тестов вы можете имитировать репозитории и проверять их.

Другой вариант - напрямую издеваться над DataContext, как показано ниже:

    private Mock<DataContext> _mockedContext;
    private Mock<DbSet<MyEntity>> _mockedMyEntitiyDbSet;

И в вашем тестовом примере:

    [Test]
    public void CargoTicket_WithValidRequest_Verify_SaveChanges()
    {
        //assuming DbContext injected to your _sut object in setup
        MockDbSet(myEntities);
        _sutObject.Badge(It.IsAny<int>(), It.IsAny<int>(), It.IsAny<int>()); // SaveChanges calling in here
        _mockedContext.Verify(s => s.SaveChanges(), Times.Once);
    }

Вы можете издеваться над DbSet, как показано ниже:

    private void MockDbSet(List<MyEntity> myEntities)
    {
        _mockedMyEntitiyDbSet= new Mock<DbSet<MyEntity>>().SetupData(myEntities);
        _mockedContext.Setup(s => s.MyEntities).Returns(_mockedMyEntitiyDbSet.Object);
    }

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