Как назначить значения BaseController из модульного теста в ASP.NET MVC - PullRequest
0 голосов
/ 12 февраля 2019

Мы пытаемся добавить модульный тест в наше существующее приложение MVC.Все наши контроллеры наследуют BaseController, который указан ниже:

public class BaseController : Controller
{
    public virtual Tenant Tenant
    {
        get { return System.Web.HttpContext.Current.Items["Tenant"] as Tenant; }
    }
}

Теперь, вот пример контроллера, наследует BaseController и работает очень хорошо:

public class DefaultController : BaseController
{
    public ActionResult Index()
    {
        // TODO: repository calls
        return View();
    }
}

Но как толькоЯ добавляю string tenantid = Tenant.Id; в вышеприведенный контроллер (приведенный ниже), мой модульный тест не пройден.

public class DefaultController : BaseController
{
    public ActionResult Index()
    {
        // TODO: repository calls
        string tenantid = Tenant.Id;
        return View();
    }
}

enter image description here

Похоже, System.Web.HttpContext.Current.Items["Tenant"] равно нулюво время выполнения модульного теста, как мне присвоить это значение в BaseController из модульного теста?

1 Ответ

0 голосов
/ 12 февраля 2019

Контроллер тока тесно связан с проблемами реализации (HttpContext), которые затрудняют его модульное тестирование в изоляции.

Просмотр текущего дизайна и развязки от HttpContext.Current, который равен null, поскольку IIS недоступен при модульном тестировании.

Также Controller уже имеет свойство HttpContext

public HttpContextBase HttpContext { get; }

, который пытается отделить с помощью HttpContextBase, который может быть издеваться.

К этому свойству можно получить доступ и установить его через ControllerContext.

Поэтому сначала обновите контроллер, чтобы использовать локальное HttpContext свойство

public class BaseController : Controller {
    public virtual Tenant Tenant {
        get { return HttpContext.Items["Tenant"] as Tenant; }
    }
}

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

//Arrange
var tenant = new Tenant() {
    //...
};
var mockHttpContext = new Mock<HttpContextBase>(); //USING MOQ
mockHttpContext.Setup(_ => _.Items["Tenant"]).Returns(tenant);

var controller = new DefaultController();
controller.ControllerContext = 
    new ControllerContext(mockHttpContext.Object, new System.Web.Routing.RouteData(), controller);

//Act
var result = controller.Index();

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