asp.net-mvc – NSubstitute:在MVC / Web Api控制器中模拟请求,
发布时间:2020-12-16 06:27:07 所属栏目:asp.Net 来源:网络整理
导读:我试图找到如何模拟MVC / Web Api控制器内可用的请求和响应对象. 这是可能的,我没有注入Request和Response对象,这些是可用的,因为控制器继承自ApiController或Controller. 有没有人有一些很好的例子来通过nsubstitute访问这些? 还有像上下文这样的其他对象
|
我试图找到如何模拟MVC / Web Api控制器内可用的请求和响应对象.
这是可能的,我没有注入Request和Response对象,这些是可用的,因为控制器继承自ApiController或Controller. 有没有人有一些很好的例子来通过nsubstitute访问这些? 还有像上下文这样的其他对象呢? 解决方法
你不必嘲笑它们.
由于它们具有读/写属性,因此您只需创建它们即可.我在book中解释了一下,我们有一个允许你这样做的课程: var orderController = ControllerContextSetup
.Of(() => new OrderController(mockOrderService.Object))
.WithDefaultConfig()
.WithDefaultRoute()
.Requesting(url)
.WithRouteData(new {controller="Order"})
.Build<OrderController>();
我在这里分享代码所以可以使用它: 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,object defaults,object constraints)
{
_controller.Configuration.Routes.MapHttpRoute(name,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();
}
}
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- asp.net-mvc – asp.net MVC扩展DataAnnotions
- asp.net-mvc – 认证之前调用的ASP.NET MVC控制器构造函数
- asp.net-core – 是否可以将NoSQL用于Identity Server 4?
- asp.net HC架构
- asp.net-mvc-3 – ASP.NET控制器名称与文件夹名称冲突
- asp.net-mvc – TDD工作单元模式Moq无法实例化类错误的代理
- asp.net-mvc – 在ASP.NET MVC的查询字符串中使用DateTime创
- ASP.NET 常用 文件上传方法
- asp.net – PipeLine模式和池标识是否会影响使用Integrated
- ASP.NET自定义控件 – 什么是最好的方式来包括嵌入式CSS引用
推荐文章
站长推荐
- asp.net – 捆绑css工作但字体没有加载
- asp.net-mvc – 在Entity Framework中干净地更新
- asp.net – 使用数据库的整数数据域绑定gridview
- ASP.NET MVC:Action Filter设置控制器变量?
- asp.net-mvc – ASP.NET MVC文化更改日期时间格式
- asp.net-mvc – 在Asp.Net MVC中使用混合身份验证
- .net – 如何将变量传递给SqlDataSource的Select
- 为什么在ASP.NET中刷新页面时会执行按钮单击事件
- Asp.net MVC 3全球查询?
- asp.net-mvc-3 – ViewModel做和不做
热点阅读
