如何对 DefaultAzureCredential 方法进行单元测试

2024-01-13

我使用默认的 azure 凭据方法获取访问令牌,同时使用函数应用程序的托管标识获取访问令牌。我能够获取令牌。但现在我不确定如何对该方法进行单元测试。这是当前状态

private async Task RefreshTokenCache()
{
    var tokenCredential = new DefaultAzureCredential();
    var accessToken = await tokenCredential.GetTokenAsync(
        new TokenRequestContext(scopes: new string[] { _config[AppConstants.ADAPIAppId] + "/.default" }) { });
    accessTokenCache.Set(AppConstants.AccessToken, accessToken.Token, DateTimeOffset.Now.AddMinutes(55));
}

是否有像 httpclientfactory 这样的东西,我可以在其中注入或传递一些连接字符串,以便我告诉 DefaultAzureCredential 不要调用 Azure?

update

我正在添加更多上下文。我使用它从 azure 获取函数应用程序中的访问令牌,以向 APIM 进行自身身份验证。所以我使用 HttpMessageHandler 来检查令牌是否不存在,调用 Azure 并获取令牌。

在功能应用程序中启动。

public override void Configure(IFunctionsHostBuilder builder)
{
 builder.Services.AddHttpClient(AppConstants.ReplyService)
 //Adding token handler middleware to add authentication related details.
 .AddHttpMessageHandler<AccessTokenHandler>();
}

处理程序文件:

protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
 {
 // Use the token to make the call.
 // other details
 request.Headers.Authorization = new AuthenticationHeaderValue(AppConstants.AuthHeader, await GetToken());
  return await base.SendAsync(request, cancellationToken);
 }
 
private async Task<string> GetToken(bool needsRefresh = false)
{
 if (accessTokenCache.GetCount() == 0 || needsRefresh)
 {
  var tokenCredential = new DefaultAzureCredential();
  var accessToken = await tokenCredential.GetTokenAsync(
  new TokenRequestContext(scopes: new string[] { _config["AppId"] + "/.default" }) { });
   accessTokenCache.Set("accessToken", accessToken.Token, DateTimeOffset.Now.AddMinutes(55));
     }
     return accessTokenCache.Get("accessToken")?.ToString() ?? throw new Exception("Unable to Fetch Access Token from Cache");
    }

你不应该使用DefaultAzureCredential像这样。它需要作为 DI 层的一部分注入到服务中,例如这里我正在设置一个新的BlobServiceClient:

private static void addAzureClients(IFunctionsHostBuilder builder)
{
    builder.Services.AddAzureClients(builder =>
    {
        try
        {
            builder.AddBlobServiceClient(Environment.GetEnvironmentVariable("AzureWebJobsStorage"));

            builder.UseCredential(new DefaultAzureCredential());
        }
        catch(Exception ex)
        {
            throw new Exception($"Error loading AddBlobServiceClient: {Environment.GetEnvironmentVariable("AzureWebJobsStorage")}", ex);
        }
    });
}

然后我使用依赖注入来使用客户端:

public MyClass(BlobServiceClient blobServiceClient)
{
    this.blobServiceClient = blobServiceClient;

}

我永远不必触碰DefaultAzureCredential根本没有课。然后当单元测试时我嘲笑BlobServiceClient这是一个抽象类。


如果您确实确定要实际使用DefaultAzureCredential那么你的答案仍然是依赖注入。我建议你这样设置:

在你的启动中:

builder.Services.AddSingleton<TokenCredential>(() => new DefaultAzureCredential());

然后(就像上面一样)将其注入到您的类中:

public MyClass(TokenCredential tokenCredential)
{
    this.tokenCredential= tokenCredential;

}

然后在你的测试中你嘲笑TokenCredential。你不能嘲笑你自己的班级new。所以你现在需要这样做

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

如何对 DefaultAzureCredential 方法进行单元测试 的相关文章

  • 如何读取扩展文件属性/文件元数据

    因此 我按照教程使用 ASP net core 将文件 上传 到本地路径 这是代码 public IActionResult About IList
  • C++ 中本地类中的静态成员变量?

    我知道我们不能宣布static本地类中的成员变量 但其原因尚不清楚 那么请问有人可以解释一下吗 另外 为什么我们不能访问非static函数内部定义的变量 内部已经定义了局部类 直接在局部类成员函数中 在下面给出的代码中 int main i
  • 在新的浏览器进程中打开 URL

    我需要在新的浏览器进程中打开 URL 当浏览器进程退出时我需要收到通知 我当前使用的代码如下 Process browser new Process browser EnableRaisingEvents true browser Star
  • 在 Unity 进程和另一个 C# 进程之间进行本地 IPC 的最快方法 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我希望每秒大约 30 次从 C 应用程序向我的 Unity 应用程序传送大量数据 由于 Unity 不支持映射内存和管道 我考虑了 t
  • 获取 WPF 控件的所有附加事件处理程序

    我正在开发一个应用程序 在其中动态分配按钮的事件 现在的问题是 我希望获取按钮单击事件的所有事件 因为我希望删除以前的处理程序 我尝试将事件处理程序设置为 null 如下所示 Button Click null 但是我收到了一个无法分配 n
  • 关于在 Windows 上使用 WiFi Direct Api?

    我目前正在开发一个应用程序 我需要在其中创建链接 阅读 无线网络连接 在桌面应用程序 在 Windows 10 上 和平板电脑 Android 但无关紧要 之间 工作流程 按钮 gt 如果需要提升权限 gt 创建类似托管网络的 WiFi 网
  • Rx 中是否有与 Task.ContinueWith 运算符等效的操作?

    Rx 中是否有与 Task ContinueWith 运算符等效的操作 我正在将 Rx 与 Silverlight 一起使用 我正在使用 FromAsyncPattern 方法进行两个 Web 服务调用 并且我想这样做同步地 var o1
  • PlaySound 可在 Visual Studio 中运行,但不能在独立 exe 中运行

    我正在尝试使用 Visual Studio 在 C 中播放 wav 文件 我将文件 my wav 放入项目目录中并使用代码 PlaySound TEXT my wav NULL SND FILENAME SND SYNC 我按下播放按钮 或
  • 如何使用 watin 中的 FileUploadDialogHandler 访问文件上传对话框

    我正在使用 IE8 和 watin 并尝试通过我的网页测试上传文件 我不能简单地使用 set 方法设置上传文件 例如 ie FileUpload Find ById someId Set C Desktop image jpg 因为上传文本
  • 上下文敏感与歧义

    我对上下文敏感性和歧义如何相互影响感到困惑 我认为正确的是 歧义 歧义语法会导致使用左推导或右推导构建多个解析树 所有可能的语法都是二义性的语言是二义性语言 例如 C 是一种不明确的语言 因为 x y 总是可以表示两个不同的事物 如下所述
  • 如何将自定义 JSON 文件添加到 IConfiguration 中?

    我正在使用 asp net Autofac 我正在尝试加载自定义 JSON 配置文件 并基于该文件创建 实例化 IConfiguration 实例 或者至少将我的文件包含到默认情况下构建的 IConfiguration asp net 中
  • 如何使用 Mongodb C# 驱动程序连接多个集合

    我需要将 3 个集合与多个集合合并在一起 lookup我在 C 驱动程序中尝试过 它允许我 lookup用户采集但无法执行秒 lookup用于设置集合 有人可以帮忙吗 db Transactions aggregate lookup fro
  • 如何编写一个同时需要请求和响应Dtos的ServiceStack插件

    我需要提供本地化数据服务 所有本地化的响应 Dto 都共享相同的属性 IE 我定义了一个接口 ILocalizedDto 来标记那些 Dto 在请求端 有一个ILocalizedRequest对于需要本地化的请求 Using IPlugin
  • 等待线程完成

    private void button1 Click object sender EventArgs e for int i 0 i lt 15 i Thread nova new Thread Method nova Start list
  • 如何从main方法调用业务对象类?

    我已将代码分为业务对象 访问层 如下所示 void Main Business object public class ExpenseBO public void MakeExpense ExpensePayload payload var
  • .NET中的LinkedList是循环链表吗?

    我需要一个循环链表 所以我想知道是否LinkedList是循环链表吗 每当您想要移动列表中的 下一个 块时 以循环方式使用它的快速解决方案 current current Next current List First 电流在哪里Linke
  • 使用 GROUP 和 SUM 的 LINQ 查询

    请帮助我了解如何使用带有 GROUP 和 SUM 的 LINQ 进行查询 Query the database IEnumerable
  • 检查Windows控制台中是否按下了键[重复]

    这个问题在这里已经有答案了 可能的重复 C 控制台键盘事件 https stackoverflow com questions 2067893 c console keyboard events 我希望 Windows 控制台程序在按下某个
  • 在客户端系统中安装后桌面应用程序无法打开

    我目前正在使用 Visual Studio 2017 和 4 6 1 net 框架 我为桌面应用程序创建了安装文件 安装程序在我的系统中完美安装并运行 问题是安装程序在其他计算机上成功安装 但应用程序无法打开 edit 在客户端系统中下载了
  • 找不到 securityToken 的有效键映射

    我正在开发测试应用程序 用于在 MVC ASP net Visual studio 2013 中显示经过身份验证的身份声明 我已通过以下方式从活动目录进行身份验证 1 在解决方案中添加新的mvc项目 2 单击更改身份验证 3 选择组织账户

随机推荐

  • PHP PDO 与 foreach 和 fetch

    以下代码
  • UnicodeDecodeError:“utf8”编解码器无法解码字节 0x9c

    我有一个套接字服务器 应该从客户端接收 UTF 8 有效字符 问题是一些客户端 主要是黑客 通过它发送了所有错误类型的数据 我可以轻松区分真正的客户端 但我将发送的所有数据记录到文件中 以便稍后进行分析 有时我会遇到这样的角色 导致Unic
  • 如何在mysql中进一步过滤GROUP BY记录?

    请检查我想要查询id 43 的完整行 以及另一个nic id最大query id行 的图像 但它只给我最大query id 我尝试了不同的查询 例如 SELECT Query id nic id date subject followup
  • Python-将Excel文件的不同工作表保存为单独的Excel文件

    新手 我有一个 Excel 文件 其中有 100 多个不同的工作表 每张纸包含多个表格和图表 我希望将每张工作表另存为新的 Excel 文件 我尝试了很多Python代码 但没有一个起作用 请在这方面提供帮助 谢谢 编辑1 为了回应评论 这
  • 检查字符串是否包含子字符串。另外,获取索引和匹配数(Raku)

    常见问题解答 在 Raku 中 如何检查String https docs perl6 org type Str包含子字符串 在哪里以及多少次 我想要 3 个功能 例如 xxx bool az and az and az again az
  • GNU、GCC 和 MinGW 之间有什么区别?

    我得知 GCC 不仅是一个编译器c questions tagged c但也适用于许多其他语言 这是真的吗 如果是这样 那么它是如何完成的呢 GNU 不是编译器 它是一个操作系统和一组自由软件 旨在 类 Unix 而不使用 Unix GNU
  • 64位函数返回32位指针

    这个函数被埋在一个复杂的嵌套中 所以实际上找到原因可能超出了我所能要求的范围 但我想知道是否有人能够提供一些关于我如何调试它的提示 这是我遇到问题的代码的要点 func1 c somestruct func1 somestruct myst
  • iOS - 如何判断本地通知是否导致我的应用程序进入前台?

    我的应用程序委托中有代码 application didReceiveLocalNotification 方法来显示UI警报视图对于本地通知 每当我的应用程序位于前台时 如果本地通知到达时我的应用程序在后台运行 则用户会收到该通知 并且能够
  • 如何仅使用 HTML 在 mozilla firefox 中打开本地文件?

    我正在尝试在 ubuntu 机器上使用 html 打开 Firefox 本地磁盘上的文件 但是 我面临文件未找到错误 我的代码如下 a href home abc workspace logfile log LOG FILE a 我尝试使用
  • 无法从包含库的应用程序启动意图

    您好 我想启动一项位于连接的图书馆项目中的服务 所有相关课程都在图书馆 该服务是从位于库中的活动调用的 Intent serviceIntent new Intent serviceIntent setAction org example
  • 如何在两个 Pandas DataFrame 对象上执行 SQL 样式不相交或设置差异?

    我正在尝试使用 Pandas 来解决一个白痴 DBA 没有对现已崩溃的数据集进行备份的问题 因此我正在尝试查找两列之间的差异 由于我不会详细说明的原因 我使用的是 Pandas 而不是数据库 我想做的是 考虑到 Dataset A A B
  • 自动装配 Spring JPA 存储库的 @Primary 等效项

    我在应用程序中使用 Spring JPA 存储库和实体 现在 在该应用程序的某种风格中 我需要扩展我的一个实体并提供一个扩展存储库 对于我需要覆盖 扩展的所有其他 bean 我只需创建一个新的实现并使用 Primary 对其进行注释 以便它
  • Android - 如何检索货币汇率[重复]

    这个问题在这里已经有答案了 我正在尝试为 Android 开发一个简单的外汇应用程序 首先 我需要获取过去一年的货币汇率 有人可以建议我该怎么做吗 我查看了 Google Financh API 但找不到如何检索货币汇率 任何建议表示赞赏
  • Clojure 时间和日期库是什么? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我找不到处理时间和日期的库http clojure org libraries http clojur
  • 每个 SQL Server 外键都应该有一个匹配的索引吗? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 在 SQL Server 数据库中为每个外键都有一个索引有哪些优点 如果有的话 是的 这是一个很好的做法 请参阅此处 SQL Server 何时
  • React 在 prop 更新时重新渲染组件

    我的想法 理解是 只要 props 或状态发生变化 React 组件就会更新 所以我声明我的变量 let percentage width 10 并有一个setInterval运行这么长时间后更改该变量的函数 setInterval fun
  • MongoDB Compass 社区身份验证失败

    我刚刚创建了一个新的 MongoDB 帐户 现在尝试连接通过 MongoDB Compass 社区应用程序创建的免费集群 但显示 身份验证失败 错误 这是我到目前为止检查过的 在我的 MongoDB Clusters 部分 当我单击 Con
  • Sparklyr 无法看到在 Hive 中创建的数据库,反之亦然

    我在本地安装了 Apache Hive 并尝试通过 Rstudio sparklyr 读取表 我使用 Hive 创建了一个数据库 hive gt CREATE DATABASE test 我尝试使用以下 R 脚本读取该数据库 library
  • 为什么这种并行搜索和替换没有使用 100% 的 CPU?

    我有一个很长的推文列表 200 万条 我使用正则表达式来搜索和替换这些推文中的文本 我使用一个运行这个joblib 平行图 https joblib readthedocs io en latest parallel html joblib
  • 如何对 DefaultAzureCredential 方法进行单元测试

    我使用默认的 azure 凭据方法获取访问令牌 同时使用函数应用程序的托管标识获取访问令牌 我能够获取令牌 但现在我不确定如何对该方法进行单元测试 这是当前状态 private async Task RefreshTokenCache va