Как установить IPrincipal для макета?

Попытайтесь использовать matplotlib. Можно настроить его с бэкендом SVG .

10
задан chobo2 21 August 2009 в 21:46
поделиться

1 ответ

Вы говорите об ASP.NET MVC? Думаю, да.

Вы должны создать экземпляр контроллера и установить его RequestContext. Вы имитируете HttpContext в RequestContext, и внутри этого HttpContext вы имитируете его свойство User и настраиваете его на свой фиктивный IPrincipal:

var principal = new Moq.Mock<IPrincipal>();
// ... mock IPrincipal as you wish

var httpContext = new Moq.Mock<HttpContextBase>();
httpContext.Setup(x => x.User).Returns(principal.Object);
// ... mock other httpContext's properties, methods, as needed

var reqContext = new RequestContext(httpContext.Object, new RouteData());

// now create the controller:
var controller = new MyController();
controller.ControllerContext =
    new ControllerContext(reqContext, controller);

Надеюсь, это поможет.

EDIT:

FYI, свойство User в Класс контроллера происходит от объекта HttpContext, как вы можете видеть здесь (это метод получения для свойства User, полученный из Reflector - вы также можете загрузить исходный код ASP.NET MVC):

public IPrincipal User
{
    get
    {
        if (this.HttpContext != null)
        {
            return this.HttpContext.User;
        }
        return null;
    }
}

Если вы теперь проверите HttpContext, вы увидите:

public HttpContextBase HttpContext
{
    get
    {
        if (base.ControllerContext != null)
        {
            return base.ControllerContext.HttpContext;
        }
        return null;
    }
}

Итак, до сих пор все было «только для чтения». И нам нужен способ «ввести» выдуманного «пользователя». Так, мы проверяем, можем ли мы действительно внедрить объект ControllerContext в контроллер через свойство. Мы проверяем, как он получает свой объект «HttpContext», чтобы знать, как правильно его создать:

public virtual HttpContextBase HttpContext
{
    get
    {
        if (this._httpContext == null)
        {
            this._httpContext = (this._requestContext != null) ? this._requestContext.HttpContext : new EmptyHttpContext();
        }
        return this._httpContext;
    }
    set
    {
        this._httpContext = value;
    }
}

Итак, здесь мы видим, что объект ControllerContext получает свой HttpContext из объекта RequestContext. Это может объяснить то, что я сделал выше:

  1. Имитация IPrincipal с нужными данными,
  2. Имитация HttpContext и передача его с помощью IPrincipal,
  3. Имитация RequestContext и передача его с помощью HttpContext,
  4. Создайте экземпляр вашего контроллера и установите его свойство ControllerContext на имитируемый объект RequestContext.

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

12129] Итак, вы можете продолжать использовать своего «Пользователя»

20
ответ дан 3 December 2019 в 19:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: