TDD внедряет Mocked Repository (UnitOfWork) во внутренний конструктор - PullRequest
0 голосов
/ 09 августа 2011

Я смотрю в TDD и столкнулся со сценарием, с которым я мог бы помочь.

Мой проект использует MVC3 и структурирован так, чтобы иметь слой BAL и DAL. Каждый слой находится в своем собственном проекте. BAL обращается к базе данных через шаблон репозитория. Поскольку я использую EntityFramework, я также реализовал шаблон UnitOfWork. Вот как выглядит класс обслуживания в BAL:

public class ExampleService
{
    private UnitOfWork unitOfWork;
    private bool isProcessing = false;

    internal ExampleService(UnitOfWork unitOfWork)
    {
        this.unitOfWork = unitOfWork;
    }
    public void ExposedMethod()
    {
        //do stuff with the unitOfWork
    }
}

Вопрос: Я хотел бы создать для этого модульный тест (очевидно, я должен был написать тест перед кодом). Однако, если я выполню код как есть, тест будет интеграционным, поскольку он будет использовать UnitOfWork и подключаться к моей базе данных. Я мог бы создать новый UnitOfWork, который обращается к фиктивным данным в памяти, но я не понимаю, как внедрить его, поскольку конструктор является внутренним. Я бы не стал писать модульные тесты, которые находятся внутри каждого проекта.

Есть мысли?

1 Ответ

3 голосов
/ 09 августа 2011

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

Другая возможность - сделать этот конструктор общедоступным, так как это сделает класс более пригодным для повторного использования. Обычно подключение DI должно выполняться на самом внешнем уровне архитектуры (GUI), и для этого конструкторы различных зависимостей должны быть открытыми. Это позволяет использовать этот слой DAL в других проектах.

...