Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Уважайте чужое время
75 / 23 / 8
Регистрация: 01.02.2013
Сообщений: 191

Mock свойства Database в Mock<DbContext> или получение результатов запроса к View из Mock

16.01.2023, 22:14. Показов 454. Ответов 0

Студворк — интернет-сервис помощи студентам
Хочу отделить тестирование БД от тестирования бизнеса, поэтому решил попробоваться в Mock'ах, однако столкнулся с необычной для себя проблемой.

Ниже метода, использующегося в покрываемом тестом:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
    private static DataTable GetViewResult(string viewName, DbContext context)
    {
        try
        {
            DataTable dataTable = new DataTable();
            DbConnection connection = context.Database.GetDbConnection();
            DbProviderFactory dbFactory = DbProviderFactories.GetFactory(connection);
            using (var cmd = dbFactory.CreateCommand())
            {
                cmd.Connection = connection;
                cmd.CommandType = CommandType.Text;
                var query = $"SELECT * FROM {viewName}";
                cmd.CommandText = query;
                using (DbDataAdapter adapter = dbFactory.CreateDataAdapter())
                {
                    adapter.SelectCommand = cmd;
                    adapter.Fill(dataTable);
                }
            }
 
            return dataTable;
        }
        catch (Exception e)
        {
            throw new Exception($"Ошибка получения данных из отображения {viewName}: ", e);
        }
    }
Что происходит в коде:
1. Есть имя View (отображения) из БД и DbContext (в тестах уже Mock<DbContext>) на эту БД.
2. Получаю DataTable из БД и возвращаю форматированную строку с этим набором.

Всё просто, но в тестах есть проблема: когда я создаю Mock<DbContext>, то получаю пустое свойство Database и логичный nullreference внутри метода.

Нашёл такой вариант:
Вынести данный метод в DbContext и пометить virtual, тогда смогу отдавать нужные данные через Setup на его Mock'е.

Мне он не слишком нравится:
1. Т.к. тесты будут косвенно загрязнять/портить боевой код подобным образом
2. Наверняка есть какой-то более Правильный вариант, с Mock'ом самого DataBase или альтернативный способ получения данных из вьюхи.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
16.01.2023, 22:14
Ответы с готовыми решениями:

Invalid setup on a non-virtual overridable in vb member: mock => mock[It.IsAny<string>()]
Вот такой код: public interface IGate { string Name { get; } } public interface ICommutator { ...

Mock/stub the database and IO devices
Добрый день Начал учить джаву и сейчас перехожу к тестировнию. Написал небольшую програмку которая работает с БД. И нужно сделать...

Mock in Unittest
Доброго времени суток! Во время написания теста столкнулся с проблемой. На сильно упрощённом примере, приведённом ниже, попробую объяснить....

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
16.01.2023, 22:14
Помогаю со студенческими работами здесь

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

Тестирование MOCK
Есть интерфейс по &quot;постройке объекта&quot;. В данном случае как пример это ручка. public interface IPenBuilder { IPenBuilder...

Mock тесты
public async Task DeleteFromDataBase(int id) { using var httpResponseMessage = await...

Mock и Stub
Как пользоваться методами mock и stub для модульного тестирования в JUnit?

No Last call on a Mock available
Столкнулся с такой проблемой при тестировании сервиса. @Test public void testExecuteCommand() { IMocksControl control =...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Новые блоги и статьи
Вывод данных через динамический список в справочнике
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Функция заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
10 пpимет, которые всегда сбываются
Maks 31.03.2026
1. Чтобы, наконец, пришла маршрутка, надо закурить. Если сигарета последняя, маршрутка придет еще до второй затяжки даже вопреки расписанию. 2. Нaдоели зима и снег? Не надо переезжать. Достаточно. . .
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 31.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
Functional First Web Framework Suave
DevAlt 30.03.2026
Sauve. IO Апнулись до NET10. Из зависимостей один пакет, работает одинаково хорошо как в режиме проекта так и в интерактивном режиме. из сложностей - чисто функциональный подход. Решил. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru