Разработка контроллера MVC с использованием TDD для вызовов базы данных - PullRequest
0 голосов
/ 24 апреля 2018

Я новичок в MVC и модульном тестировании. Мне нужно выполнить модульное тестирование на моих контроллерах, но я боюсь, что они могут быть неправильно настроены.

Например:

public class MyController
{
     public ActionResult Index(int id)
     {
         var locations = new MyLocations().GetLocations();
         //linq code here that filters based on id
         return View(filteredLocations)
     }
}

Это действительно простой пример, но как мне правильно настроить его, чтобы я мог использовать модель TDD, чтобы при модульном тестировании я мог предоставить статический список местоположений в качестве возвращаемого значения?

Я не уверен, как это должно быть правильно структурировано.

1 Ответ

0 голосов
/ 24 апреля 2018

Тесная связь из-за new MyLocations() означает, что вы не сможете управлять его поведением.

создать абстракцию зависимости

public interface ILocations {
    IEnumerable<Location> GetLocations();
}

имеет реализацию, производную от абстракции

public class MyLocations : ILocations {
    public IEnumerable<Location> GetLocations() {
        //...db calls here
    }
}

и контроллер рефакторинга в зависимости от абстракции

public class MyController : Controller {
    private readonly ILocations myLocations;

    public MyController(ILocations myLocations) {
        this.myLocations = myLocations;
    }

    public ActionResult Index(int id) {
       var locations = myLocations.GetLocations();
       //linq code here that filters based on id
       return View(filteredLocations);
    }
}

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

В производственном процессе вы должны настроить DependencyResolver для сопоставления интерфейса с реализацией и вставить его в контроллер.

Ссылка ASP.NET MVC 4 Внедрение зависимостей

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