насмешливый ответ
Однако я нашел следующий способ сделать это:
Разделите DAL на 2 слоя. Дно просто выполняет атомарное чтение и запись в базы данных - все эти объекты реализуют набор интерфейсов IReadFromDB и IWriteToDB.
Затем вы можете создать свою бизнес-логику для чтения и записи на более высоком уровне DAL, но не ссылаться на объекты, которые будут считывать и записывать в базу данных, ссылаться на интерфейсы и использовать свойства, чтобы иметь возможность заменять функциональность. Я склонен включать нужные конструкторы в конструкторы, чтобы все работало «из коробки», так сказать.
Это позволит легко «поменять» функциональность и провести модульное тестирование бизнес-логики.
Что касается тестирования чтения и записи БД ... Я не нашел способа, который не требовал бы работы.
Я обычно использую другую строку подключения к копии базы данных, а затем пишу генерацию данных и код очистки для модульных тестов, чтобы оставить состояние базы данных таким же, как до и после.
Да, это отнимает много времени ... однако это не рискует оттолкнуть клиента. Это зависит от ваших приоритетов.
Кто-то еще упомянул тестирование производительности. Я бы не стал считать это частью модульного теста. Я обычно делаю это с помощью тестового набора в сочетании с отладочным кодом просто потому, что производительность мелких деталей часто вводит в заблуждение - когда вы переходите к общей картине, части, которые на самом деле являются проблемами с корпусом, часто не являются частями, которые локализованное тестирование отметит в моем опыте .