2010-05-05 4 views
13

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

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

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

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

Благодаря

+0

Я прочитал «Если бы я создал проект уровня данных, я бы переместил все мои репо на этот проект?» вопрос, как вы уже используете шаблон репозитория, предложенный в ответах ниже, но, видимо, вам также нужно сделать какой-то доступ к базе данных в некоторых ваших тестах? Обычно это означает, что вы действительно тестируете Linq для SQL, чего я ожидал бы от инженеров Microsoft уже.Я бы посоветовал вам избегать этих методов и протестировать ваши репозитории с помощью бэкэнда memorycontext, как описано в статье Jason Jones. – AHM

ответ

5

Я использую 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 который затем использует издевается для имитации 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 для вдохновения; удачи.

6

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

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

Ссылка на статью онлайн. Repository Pattern

Смежные вопросы