【发布时间】:2014-02-04 19:52:51
【问题描述】:
我正在使用 WebApi2 开发一个项目。在我的测试项目中,我使用的是 Moq 和 XUnit。
到目前为止,测试一个 api 非常简单,可以像 GET 一样进行
[Fact()]
public void GetCustomer()
{
var id = 2;
_customerMock.Setup(c => c.FindSingle(id))
.Returns(FakeCustomers()
.Single(cust => cust.Id == id));
var result = new CustomersController(_customerMock.Object).Get(id);
var negotiatedResult = result as OkContentActionResult<Customer>;
Assert.NotNull(negotiatedResult);
Assert.IsType<OkNegotiatedContentResult<Customer>>(negotiatedResult);
Assert.Equal(negotiatedResult.Content.Id,id);
}
现在我正在处理一些复杂的事情,我需要从请求标头中访问值。
我通过扩展 IHttpActionResult 创建了自己的 Ok() 结果
public OkContentActionResult(T content,HttpRequestMessage request)
{
_request = request;
_content = content;
}
这允许我有一个从请求中读取标头值的小助手。
public virtual IHttpActionResult Post(Customer customer)
{
var header = RequestHeader.GetHeaderValue("customerId", this.Request);
if (header != "1234")
我是如何使用虚拟请求设置 Moq 的?
我花了大约最后一个小时寻找一个允许我使用 webapi 执行此操作的示例,但是我似乎找不到任何东西。
到目前为止......我很确定它的 api 是错误的,但我有
// arrange
var context = new Mock<HttpContextBase>();
var request = new Mock<HttpRequestBase>();
var headers = new NameValueCollection
{
{ "customerId", "111111" }
};
request.Setup(x => x.Headers).Returns(headers);
request.Setup(x => x.HttpMethod).Returns("GET");
request.Setup(x => x.Url).Returns(new Uri("http://foo.com"));
request.Setup(x => x.RawUrl).Returns("/foo");
context.Setup(x => x.Request).Returns(request.Object);
var controller = new Mock<ControllerBase>();
_customerController = new CustomerController()
{
// Request = request,
};
我不太确定接下来我需要做什么,因为过去我不需要设置模拟 HttpRequestBase。
谁能推荐一篇好文章或指出正确的方向?
谢谢!!!
【问题讨论】:
标签: asp.net-web-api moq xunit xunit.net asp.net-web-api2