【问题标题】:C# Unit Test project against WebApi with Owin使用 Owin 针对 WebApi 的 C# 单元测试项目
【发布时间】:2017-01-07 15:59:43
【问题描述】:

我的目标是在 Visual Studio 中针对我的 Web API 运行测试。正如我在网上某处看到的那样,我正在尝试调用控制器。

var controller = new PriceFeedController();

dynamic item = controller.Get(1, 1);

controller.Post(new PostPriceFeed { Item_Id = 1, Store_Id = 1, Price = decimal.Parse(item.pricefeed.price) + 10 });
dynamic itemprice_updated = controller.Get(1, 1);
Assert.AreEqual(decimal.Parse(item.pricefeed.price), decimal.Parse(itemprice_updated.pricefeed.price));

主要问题是关于 OWIN。我的控制器以这样的开头:

[HttpGet]
public IHttpActionResult Get(long storeId, long itemId)
{
    //busco o id do usuário
    var user_id = SessionState.GetUserIDByContext(Request.GetRequestContext());
    //...
}

当我尝试运行测试时,Request 为空,我收到错误消息。 有人知道如何做我想做的事吗?

编辑

在@Peter 提示之后,我可以插入请求,但我的声明不存在。

 ClaimsPrincipal principal = httpRequestContext.Principal as ClaimsPrincipal;
        return long.Parse(principal.Claims.Where(c => c.Type == "user_id").Single().Value);

“user_id”不存在,但我正在传递令牌。

【问题讨论】:

  • 我正在使用承载令牌顺便说一句

标签: c# unit-testing asp.net-web-api2 owin


【解决方案1】:

您可以在初始化期间显式设置 Controller 的 Request 属性。一旦控制器有一个请求,您就可以添加控制器操作中可用的属性。

如果您使用 Request 属性进行身份验证,则需要更多步骤来安全地处理它(有关 API 令牌的示例,请参阅 Securing and securely calling Web API and [Authorize]

var controller = new PriceFeedController {Request = new HttpRequestMessage()};
controller.Request.Properties.Add(HttpPropertyKeys.HttpConfigurationKey,
    new HttpConfiguration());

controller.Request.Properties.Add("sample_property",
    "plaintext string to pass to Get() method on PriceFeed");

var result = controller.Get(100, 105);

【讨论】:

  • 很好的提示@Peter,谢谢!我快到了,唯一的问题是在控制器中。在我尝试检索我的 user_id 声明时请求之后!我生成不记名令牌时创建的声明不存在。但是当我在任何应用程序中使用 api 时,它都可以正常工作。
  • 您需要使用正确的声明创建一个 ClaimsPrincipal 并将控制器的 User 属性设置为该对象。不过老实说,您应该将此答案标记为已接受的答案,并询问另一个是否还有其他问题。