Модульное тестирование ASP.NET MVC с данными - PullRequest
6 голосов
/ 15 декабря 2010

У нас безумно управляемое данными приложение. Мы хотим провести модульное тестирование приложения, но разработчики устойчивы к созданию полностью поддельных репозиториев из-за объема данных. Я их не виню.

Поймите, что мы модифицируем тесты в существующее приложение. Если бы мы начинали заново, мы бы внесли массу архитектурных изменений, чтобы облегчить более качественное модульное тестирование с использованием поддельных репозиториев.

Мы хотели бы распространить известный mdf-файл с тестами, скопировать его и использовать для выполнения наших тестов. Есть ли одобренная методика для этого? Я знаком с встраиванием ресурсов в тестовую dll, но не со встраиванием mdf - если это вообще возможно.


Решение (вроде):

Я закончил тем, что взял DataContextWrapper из поста Эндрю Токли о насмешливых контекстах данных Linq (http://andrewtokeley.net/archive/2008/07/06/mocking-linq-to-sql-datacontext.aspx) и создал FakeDataContext.cs, который в основном представляет собой набор списков.

Я написал по-настоящему варварский шаблон T4 (подумайте "select * FROM <# = table.BaseClass.QualifiedName #>"), чтобы скопировать данные из известной хорошей базы данных и создать огромный класс, полный таких вещей, как:

List<Customer> _customers = new List<Customer>();
_customers.Add(new Customer(){CustomerId = 1, CustomerName = "ACME"});

и т.д.

Класс имеет 25K строк, но, так как t4 записывает все эти строки, кого это волнует? Это позволяет нам имитировать только контекст данных, поэтому мы можем тестировать наш linq против поддельного контекста с некоторой разумной уверенностью, что мы правильно выполнили запросы. Оригинальные разработчики вложили в репозиторий тонну бизнес-логики, что позволяет нам проверять логику на основе достоверных данных.

Ответы [ 2 ]

5 голосов
/ 15 декабря 2010

Можете ли вы настроить тестовую базу данных на общем сервере, чтобы вам не приходилось развертывать файлы mdf?

Кроме того, вы можете обернуть все модульные тесты с помощью TransactionScope?

I 'мы использовали тестовую базу данных в моей компании, которая содержала общеизвестные справочные данные для всех тестов, и создали базовый класс для интеграционных тестов:

[TestClass]
public class ServiceTest
{
    private TransactionScope Transaction { get; set; }

    [TestInitialize]
    public virtual void TestInitialize()
    {
        Transaction = new TransactionScope();
    }

    [TestCleanup]
    public virtual void TestCleanup()
    {
        Transaction.Dispose();
    }
}

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

0 голосов
/ 15 декабря 2010

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

Я имел большой успех с Moq, но потом я написал свой код с внедрением зависимостей с самого начала.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...