Модульное тестирование на уровне доступа к данным - PullRequest
13 голосов
/ 05 мая 2010

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

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

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

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

Спасибо

Ответы [ 2 ]

6 голосов
/ 06 мая 2010

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

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

Вот ссылка на онлайн статью. Шаблон репозитория

5 голосов
/ 06 мая 2010

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

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

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

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

Проект Car.Data

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's 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 видео для вдохновения; удачи.

...