Попытайтесь использовать matplotlib. Можно настроить его с бэкендом SVG .
Вы говорите об 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. Это может объяснить то, что я сделал выше:
После всей этой магии контроллер не будет знать, что вы вызываете его без фактического подключения через веб-сервер.
12129] Итак, вы можете продолжать использовать своего «Пользователя»