Модульное тестирование с использованием уровня доступа к данным

что такое хороший способ писать модульные тесты с LINQ to SQL DAL?

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

Итак, у меня есть две копии DAL, одна в моем основном проекте и одна в тестовом проекте. Легче ли управлять этими вещами, если я создаю отдельный проект для слоя данных? Я не уверен, какой путь - лучший способ приблизиться к этому.

Если я создам проект уровня данных, я бы переместил все мое репо на этот проект? Я не уверен, как правильно настроить слои.

Спасибо

Ответ 1

Я использую Linq2Sql для моего слоя DAL, и у меня это как отдельный проект. В моем доменном проекте у меня есть интерфейс репозитория, который я затем реализую с помощью пользовательского Linq2SqlCarRepository в моем проекте DAL, этот класс обертывает созданные классы Linq2Sql.

например. В проекте Car.Core

 public interface ICarRepository
 {
    IQueryable<Car> GetAllCars();
    void Add(Car);
 }

Затем у меня есть реализация интерфейса, который завершает доступ к сгенерированному классу Linq2Sql.

Проект Car.Data​​p >

public class SqlCarRepository : ICarRepository
{
    private CarDataContext _context;

    public SqlCarRepository()
    {
        _context = new CarDataContext();
    }

    #region ICarRepository Members

    public IQueryable<Car> GetAllCars()
    {
        return _context.Cars;
    }

Затем у меня есть тестовый проект Car.Data.Test, который затем использует mocks для издевательства ICarRepository и тестирования. Я думаю, что это немного отличается от того, что вы описываете. Но я думаю, что вы хотите попробовать и отделить DAL от своего приложения, чтобы это было периферийное устройство, которое можно было бы поменять, если вы захотите.

У меня нет всех полностью отсортированных, но у меня есть эти проекты:

Car.Core         --- All the interfaces and domain objects, DTO etc
Car.Core.Tests   --- The tests of the core business logic.
Car.Web          --- Asp.net MVC frontend
Car.Web.Tests    --- Tests for the website
Car.Data         --- The Linq2Sql stuff lives in here
Car.Data.Tests   --- The tests for the DAL layer

То, что у меня есть сейчас, хотя это может быть не лучший способ сделать это сейчас.

Я бы рекомендовал прочитать The Onion Architecture и посмотреть MVC StoreFront для вдохновения; удачи.

Ответ 2

Я бы использовал шаблон репозитория, описанный в статье за ​​сентябрь 2009 года в журнале Visual Studio под названием "Устранение зависимостей базы данных в тестовой разработке". Я использовал этот шаблон, так как я читал статью с большим успехом. Этот шаблон поможет отделить ваш уровень данных и написать хорошие модульные тесты.

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

Вот ссылка на онлайн-статью. Образцовый шаблон