Как выполнить модульное тестирование базовых контроллеров asp.net mvc без попадания в базу данных? - PullRequest
0 голосов
/ 26 марта 2009

Я использовал модульное тестирование для контроллеров с техникой внедрения зависимостей «бедняги». Каждый контроллер наследует от базового контроллера для запроса данных для главной страницы. Как выполнить модульное тестирование контроллера с его наследованием от базового контроллера, не обращаясь к базе данных?

public class HomeController : BaseController
{
    IUserRepository _userRepository;

    public HomeController() : this(new UserRepository()) {

    }

    public HomeController(IUserRepository userRepository) {
        _userRepository = userRepository;
    }
}

public class BaseController : Controller
{
    protected override void Execute(System.Web.Routing.RequestContext requestContext)
    {
        MyDataContext db = new MyDataContext();

        ViewData["masterPageData"] = db.GetSomeData();

        base.Execute(requestContext);
    }
}

Ответы [ 3 ]

1 голос
/ 26 марта 2009

Код будет выглядеть примерно так:

public class HomeController : BaseController
{
    IUserRepository _userRepository;
    public HomeController() : this(new UserRepository()) { }
    public HomeController(IUserRepository userRepository) : base() {
        _userRepository = userRepository;
    }
    public HomeController(IUserRepository userRepository, ISomeRepository someRepository) : base(someRepository) {
        _userRepository = userRepository;
    }
}
public class BaseController : Controller
{
    ISomeRepository _someRepository;
    public BaseController(ISomeRepository someRepository)
    {
        _someRepository = someRepository;
    }
    public BaseController()
    {
        _someRepository = new SomeRepository();
    }
    protected override void Execute(System.Web.Routing.RequestContext requestContext)
    {
        MyDataContext db = new MyDataContext();
        ViewData["masterPageData"] = _someRepository.GetSomeData();
        base.Execute(requestContext);
    }
}

Тем не менее, если вы используете DI-фреймворк, вам понадобится только 1 конструктор в каждом классе. Таким образом, вы можете видеть, как он начинает склоняться к использованию :).

0 голосов
/ 26 марта 2009

Я бы сказал, что проблема в том, что ваш базовый контроллер использует другой подход к доступу к данным. Более того, BaseController жестко привязан к DataContext, что приводит к проблемам с тестируемостью.

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

Таким образом, легко создать макет для данных главной страницы.

0 голосов
/ 26 марта 2009

возможно, имея интерфейс в вашем текстовом тексте и вставив ваш текстовый текст, затем реализуйте макет интерфейса, который возвращает вам данные без попадания в базу данных

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