【问题标题】:Unit testing ASP.net Web API with IPrincipal set使用 IPrincipal 集对 ASP.net Web API 进行单元测试
【发布时间】:2013-11-09 08:01:00
【问题描述】:

我正在尝试对 Web API 控制器进行单元测试。以前在对标准 MVC 控制器进行单元测试时,我已经能够模拟 HTTPContext/Request/User 并通过设置控制器上下文来插入它们。但是,这不适用于 Web API 控制器(ControllerContext 的构造函数显然不接受 Web API)。

到目前为止,我有以下设置请求对象。

HttpConfiguration configuration = new HttpConfiguration();
HttpRequestMessage request = new HttpRequestMessage();

controller.Request = request;
controller.Request.Properties["MS_HttpConfiguration"] = configuration;

这工作正常,请求对象可用。但是我找不到设置主要用户的任何方法。我已经尝试了以下

Thread.CurrentPrincipal = //Set User
HttpContext.Current = //Set User

看起来两者都不起作用。

【问题讨论】:

  • 使用 Selenium 或类似的。你不能嘲笑一切。
  • 当您说“能够模拟”时,您使用的是模拟框架吗?
  • 是的,我们使用的是 Moq/NUnit。
  • 你能指定你尝试测试的Api方法吗?您尝试测试的具体行为是什么?

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


【解决方案1】:

在较新版本的 web api 中,您可以直接在 ApiController 上设置用户,就像这样

[TestMethod]
public void GetReturnsProduct()
{
    // Arrange
    var username = "username@example.com"
    var user = new ClaimsPrincipal(new CustomIdentity(username));
    var controller = new ProductsController(repository);
    controller.Request = new HttpRequestMessage();
    controller.Configuration = new HttpConfiguration();
    controller.User = user;


    // Act
    var response = controller.Get(10);

    // Assert
    Product product;
    Assert.IsTrue(response.TryGetContentValue<Product>(out product));
    Assert.AreEqual(10, product.Id);
}

【讨论】:

    猜你喜欢
    • 2015-11-09
    • 1970-01-01
    • 1970-01-01
    • 2023-02-24
    • 2018-12-23
    • 2013-01-19
    • 2015-09-17
    • 2014-01-11
    • 2012-03-18
    相关资源
    最近更新 更多