测试 WebApi 控制器时如何生成 Asp.net 用户身份

2024-04-29

我正在使用 Web API 2。在 web api 控制器中我使用过GetUserId使用 Asp.net Identity 生成用户 ID 的方法。

我必须为该控制器编写 MS 单元测试。如何从测试项目访问用户 ID?

我在下面附上了示例代码。

网络 API 控制器

public IHttpActionResult SavePlayerLoc(IEnumerable<int> playerLocations)
{
    int userId = RequestContext.Principal.Identity.GetUserId<int>();
    bool isSavePlayerLocSaved = sample.SavePlayerLoc(userId, playerLocations);
    return Ok(isSavePlayerLocSaved );
}

Web API 控制器测试类

[TestMethod()]
public void SavePlayerLocTests()
{
    var context = new Mock<HttpContextBase>();
    var mockIdentity = new Mock<IIdentity>();
    context.SetupGet(x => x.User.Identity).Returns(mockIdentity.Object);
    mockIdentity.Setup(x => x.Name).Returns("admin");
    var controller = new TestApiController();
    var actionResult = controller.SavePlayerLoc(GetLocationList());
    var response = actionResult as OkNegotiatedContentResult<IEnumerable<bool>>;
    Assert.IsNotNull(response);
}

我尝试使用上面的模拟方法。但它不起作用。当我从测试方法调用控制器时,如何生成 Asp.net 用户身份?


如果请求经过身份验证,则应使用相同的原则填充 User 属性

public IHttpActionResult SavePlayerLoc(IEnumerable<int> playerLocations) {
    int userId = User.Identity.GetUserId<int>();
    bool isSavePlayerLocSaved = sample.SavePlayerLoc(userId, playerLocations);
    return Ok(isSavePlayerLocSaved );
}

for ApiController你可以设置User安排单元测试时的属性。然而,该扩展方法正在寻找一个ClaimsIdentity所以你应该提供一个

测试现在看起来像

[TestMethod()]
public void SavePlayerLocTests() {
    //Arrange
    //Create test user
    var username = "admin";
    var userId = 2;

    var identity = new GenericIdentity(username, "");
    identity.AddClaim(new Claim(ClaimTypes.NameIdentifier, userId.ToString()));
    identity.AddClaim(new Claim(ClaimTypes.Name, username));

    var principal = new GenericPrincipal(identity, roles: new string[] { });
    var user = new ClaimsPrincipal(principal);

    // Set the User on the controller directly
    var controller = new TestApiController() {
        User = user
    };

    //Act
    var actionResult = controller.SavePlayerLoc(GetLocationList());
    var response = actionResult as OkNegotiatedContentResult<IEnumerable<bool>>;

    //Assert
    Assert.IsNotNull(response);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

测试 WebApi 控制器时如何生成 Asp.net 用户身份 的相关文章

随机推荐

  • 如何在 Cypress 的 E2E 测试中登录 Auth0?

    我已经开始测试 React Web 应用程序 但我没有走得太远 因为我遇到了登录问题 我在用cypress https www cypress io e2e测试工具 将显示一个带有登录按钮的欢迎页面 该页面会将您重定向到auth0 http
  • Traefikv2.3 出现 `Failed to list *v1beta1.IngressClass: ingressclasses.networking.k8s.io` 错误

    我正在尝试使用Traefik Kubernetes Ingress 我在用着traefik v2 3 K8的cli版本是v1 18 3服务器版本是v1 18 6IKS 我正在使用 IBM Kubernetes 服务来部署它 但我在 pod
  • 将 SSL 与 MAMP PRO 4 结合使用

    由于我已更新到 chrome 63 我在 localhost 中的网站被重定向到 https 因此我决定将 SSL 与 MAMP PRO 一起使用 但我无法使其工作 chrome 说您的连接不是私有的 在 MAMP 的 SSL 面板中 我生
  • 在 Three.js 中获取 Object3D 的大小

    我的场景中有这个 3D 对象 var icon new THREE Object3D var iconTexture THREE ImageUtils loadTexture images icon png iconMaterial new
  • Next.js API 路由神秘地修改 JSON 负载

    由于某种原因 当我通过 Postman 作为原始文本发送 JSON 格式的数据时 没有任何问题 当我通过 Postman 发送与原始 JSON 完全相同的数据时 区别应该只是content type标头是application json代替
  • 抑制 retina.js 库中的 404 错误

    我们使用js库视网膜 js https github com imulus retinajs 它将低质量图像替换为 视网膜 图像 大小乘以 2 问题是 retina js 会为每个无法找到的 视网膜 图像抛出 404 错误 我们拥有一个网站
  • Github 下载文件夹为 zip

    如何为我的 Github 存储库的访问者提供一个链接 以将我的存储库的 builds 文件夹下载为 zip 文件 该文件夹包含应用程序所需的可执行文件 着色器和纹理 当然 我可以手动构建该目录的 zip 文件并将其添加到存储库中 但这会导致
  • Devise 和 Ruby on Rails:尝试登录时如何解决“Completed 401 Unauthorized”问题

    我正在尝试将 Devise gem v4 7 2 与 Ruby on Rails v6 0 3 2 一起使用 单击 登录 按钮时 我收到以下输出 Started POST users sign in for 1 at 2020 11 21
  • 如何从 CMake 运行 .bat 文件?

    如何在预链接或构建后事件中从 CMake 运行 bat 文件 你可以使用add custom command e g if WIN32 add custom command TARGET
  • 如何在 Android WebView 中从远程 URL 访问本地资源?

    要加载 HTML 中的资源 我使用 URLfile android asset my image png 当我在本地加载 HTML 时 它可以工作 例如 使用WebView loadData method 但是 我无法从远程网站加载本地资源
  • 使用 JsonWriter 时,WriteStartConstructor 的用途是什么?

    标题说明了一切 我看到它 及其相应的结尾 吐出以下内容 new Foo 但我不明白什么new实际上是在反序列化时执行的 文档只是说它编写了一个 Json 构造函数 但没有说 Json 构造函数是什么is 此方法是作为增强功能的一部分引入的
  • React textarea 的值是只读的,但需要更新

    我的 React 应用程序中有一个文本区域 其中填充了一个值 我希望更新此文本区域并提交表单以更新数据库中的行
  • 在 iOS 8 中呈现相机权限对话框

    当我的应用程序在 iOS 8 上第一次尝试访问摄像头时 会向用户显示一个摄像头权限对话框 很像 iOS 7 中用于访问麦克风的麦克风对话框 在 iOS 7 中 可以预先调用麦克风权限对话框并查看是否授予了权限 请参阅这个问题 https s
  • 将数据导入 Django 的好方法

    我想定期将数据导入 Django 项目 我需要告诉我的数据提供者我想要以什么格式接收数据 我应该以 Json XML CSV 格式请求吗 在 Django 中通常如何处理这个问题 Django 有一个用于导入数据的完整框架 称为 Fixtu
  • 无法使用 process.ErrorDataReceived c# 获取进程错误输出

    我已经建立了Form我使用了一段时间的应用程序 现在我想捕捉StandardError我的流程及其standartOutput 我查看了答案SO and MSDN https msdn microsoft com en us library
  • jquery 可以操作用 DOM 创建的临时文档吗?

    我想要实现的目标是通过传递一个大的 html 字符串来操作使用 jquery 使用 DOM 创建的文档 考虑以下示例 var doctype document implementation createDocumentType html v
  • 如何在库的上下文中实例化 Spring?

    我正在寻找一个示例 该示例展示了如何在打包在普通旧的 不可执行的 java 库 JAR 中的一组类的上下文中实例化 Spring 容器 这里的核心目的是提供依赖注入 主要用于日志记录 我认为最根本的问题是不可执行的 jar 没有单一的启动点
  • 如何接收在 PHP 中使用“application/octet-stream”发送的 POST 数据?

    这就是我正在处理的事情 我们的一个计划有一个支持表格 用户可以使用它来请求支持 此表单的作用是 它向 PHP 脚本执行 HTTP POST 请求 该脚本应该收集信息并将其转发到支持电子邮件地址 POST 请求包含三个类型的文本字段Conte
  • 如何提取数字(以及比较形容词或范围)

    我正在用 Python 开发两个 NLP 项目 它们都有类似的任务提取数值和比较运算符来自句子 如下所示 greater than 10 weight not more than 200lbs height in 5 7 feets fas
  • 测试 WebApi 控制器时如何生成 Asp.net 用户身份

    我正在使用 Web API 2 在 web api 控制器中我使用过GetUserId使用 Asp net Identity 生成用户 ID 的方法 我必须为该控制器编写 MS 单元测试 如何从测试项目访问用户 ID 我在下面附上了示例代码