NSubstitute:嘲讽请求,MVC /网络API控制器内部响应对象? [英] NSubstitute: Mocking the request, response object inside a MVC/Web Api Controller?

查看:121
本文介绍了NSubstitute:嘲讽请求,MVC /网络API控制器内部响应对象?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图找到如何嘲笑那些可从MVC /网页API控制器内无论是Request和Response对象。

I am trying to find how to mock both the Request and Response objects that are available inside a controller from MVC / Web Api.

这是可能的,我不是注射Request和Response对象,这些都可以因为控制器从ApiController或控制器继承。

Is this possible, I am not injecting the Request and Response objects, these are available because the controllers inherit from ApiController or Controller.

有没有人有一些很好的例子,通过nsubstitute获得访问这些?

Does anyone have some good examples for getting access to these through nsubstitute ?

还有什么样的上下文中的其他对象?

Also what about the other objects like context ?

推荐答案

您不必嘲笑他们。

由于他们具有读/写性能,你所要做的就是创建它们。我解释多一点在我们的,我们有一个类,允许你做这样的:

Since they have read/write properties, all you have to do is to create them. I explain it a bit more in our book and we have a class that allows you to do this:

var orderController = ControllerContextSetup
   .Of(() => new OrderController(mockOrderService.Object))
   .WithDefaultConfig()
   .WithDefaultRoute()
   .Requesting(url)
   .WithRouteData(new {controller="Order"})
   .Build<OrderController>();

我在这里分享code,因此可以用:

I am sharing the code here so it can be used:

public class ControllerContextSetup
{

    private const string DefaultApiName = "DefaultApi";
    private readonly ApiController _controller;
    private HttpRouteData _httpRouteData;

    private ControllerContextSetup(ApiController controller)
    {
        _controller = controller;
        _controller.Request = new HttpRequestMessage();
    }

    public static ControllerContextSetup Of<T>(Func<T> factory)
        where T : ApiController
    {
        return new ControllerContextSetup(factory());
    }

    public static ControllerContextSetup Of<T>()
        where T : ApiController, new()
    {
        return new ControllerContextSetup(new T());
    }

    public ControllerContextSetup WithDefaultConfig()
    {
        _controller.Configuration = new HttpConfiguration();
        _controller.Request.Properties[HttpPropertyKeys.HttpConfigurationKey] = _controller.Configuration;
        return this;
    }

    public ControllerContextSetup WithConfig(HttpConfiguration configuration)
    {
        _controller.Request.Properties[HttpPropertyKeys.HttpConfigurationKey] = configuration;
        _controller.Configuration = configuration;
        return this;
    }

    public ControllerContextSetup Requesting(string uriString)
    {
        Uri uri = null;
        bool success = Uri.TryCreate(uriString, UriKind.Relative, out uri);
        if (success)
            return Requesting(uri);

        success = Uri.TryCreate(uriString, UriKind.Absolute, out uri);
        if(success)
            return Requesting(uri);

        return Requesting(new Uri(uriString));

    }

    public ControllerContextSetup Requesting(Uri uri)
    {
        _controller.Request.RequestUri = uri;
        return this;
    }

    public ControllerContextSetup WithDefaultRoute()
    {
        _controller.Configuration.Routes.MapHttpRoute(
            name: DefaultApiName,
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
            );
        return this;
    } 

    public ControllerContextSetup WithRoute(string name, string routeTemplate)
    {
        _controller.Configuration.Routes.MapHttpRoute(name, routeTemplate);
        return this;
    }

    public ControllerContextSetup WithRoute(string name, string routeTemplate, object defaults)
    {
        _controller.Configuration.Routes.MapHttpRoute(name, routeTemplate, defaults);
        return this;
    }

    public ControllerContextSetup WithRoute(string name, string routeTemplate, object defaults, object constraints)
    {
        _controller.Configuration.Routes.MapHttpRoute(name, routeTemplate, defaults, constraints);
        return this;
    }

    public ControllerContextSetup WithRoute(string name, IHttpRoute route)
    {
        _controller.Configuration.Routes.Add(name, route);
        return this;
    }

    /// <summary>
    /// Uses default route
    /// </summary>
    /// <param name="routeValues"></param>
    /// <returns></returns>
    public ControllerContextSetup WithRouteData(object routeValues)
    {
        return WithRouteData(new HttpRouteValueDictionary(routeValues));
    }

    /// <summary>
    /// Uses default route
    /// </summary>
    /// <param name="routeValues"></param>
    /// <returns></returns>
    public ControllerContextSetup WithRouteData(HttpRouteValueDictionary routeValues)
    {
        var route = _controller.Configuration.Routes[DefaultApiName];
        _httpRouteData = new HttpRouteData(route, routeValues); 
        _controller.Request.Properties[HttpPropertyKeys.HttpRouteDataKey] = _httpRouteData;
        return this;
    }

    public ControllerContextSetup WithMethod(HttpMethod method)
    {
        _controller.Request.Method = method;
        return this;
    } 

    public ApiController Build()
    {
        _controller.ControllerContext =
            new HttpControllerContext(_controller.Configuration, 
                _httpRouteData ?? new HttpRouteData(_controller.Configuration.Routes.FirstOrDefault()) , 
                _controller.Request);
        return _controller;
    }


    public T Build<T>()
        where T : ApiController
    {
        return (T) Build();
    }
}

这篇关于NSubstitute:嘲讽请求,MVC /网络API控制器内部响应对象?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆