Pester 测试用例失败时显示哈希表的内容

2023-12-12

Problem

When a Hashtable用作输入Should,Pester 只输出类型名而不输出内容:

Describe 'test' {
    It 'test case' {
        $ht = @{ foo = 21; bar = 42 }
        $ht | Should -BeNullOrEmpty
    }
}

Output:



Expected $null or empty, but got @(System.Collections.Hashtable).
  

预期输出如:



Expected $null or empty, but got @{ foo = 21; bar = 42 }.
  

Cause

看着纠缠源,测试输入由私有函数格式化Format-Nicely,它只是投射到String如果值类型是Hashtable。这归结为调用Hashtable::ToString(),它只输出类型名称。

解决方法

作为一种解决方法,我目前正在从中派生一个类Hashtable覆盖ToString方法。在将输入传递给之前Should,我将它投射到这个自定义类。这让 Pester 称我被覆盖ToString格式化测试结果时的方法。

BeforeAll {
    class MyHashTable : Hashtable {
        MyHashTable( $obj ) : base( $obj ) {}
        [string] ToString() { return $this | ConvertTo-Json }
    }
}

Describe 'test' {
    It 'test case' {
        $ht = @{ foo = 21; bar = 42 }
        [MyHashTable] $ht | Should -BeNullOrEmpty
    }
}

现在 Pester 输出HashtableJSON 格式的内容,这对我来说已经足够了。

Question

有没有更优雅的方式来自定义 Pester 输出Hashtable,这不需要我更改每个测试用例的代码?


有点黑客行为,覆盖 Pester 的私有Format-Nicelycmdlet 通过定义同名的全局别名来实现。

BeforeAll {
    InModuleScope Pester {
        # HACK: make private Pester cmdlet available for our custom override
        Export-ModuleMember Format-Nicely
    }

    function global:Format-NicelyCustom( $Value, [switch]$Pretty ) {
        if( $Value -is [Hashtable] ) {
            return $Value | ConvertTo-Json
        }
        # Call original cmdlet of Pester
        Pester\Format-Nicely $Value -Pretty:$Pretty
    }

    # Overrides Pesters Format-Nicely as global aliases have precedence over functions
    New-Alias -Name 'Format-Nicely' -Value 'Format-NicelyCustom' -Scope Global
}

这使我们能够像往常一样编写测试用例:

Describe 'test' {
    It 'logs hashtable content' {
        $ht = @{ foo = 21; bar = 42 }
        $ht | Should -BeNullOrEmpty
    }   

    It 'logs other types regularly' {
        $true | Should -Be $false 
    }
}

第一个测试用例的日志:



Expected $null or empty, but got @({
 "foo": 21,
 "bar": 42
}).
  

第二个测试用例的日志:



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

Pester 测试用例失败时显示哈希表的内容 的相关文章

  • Jenkins 执行 PowerShell 脚本

    我正在尝试从 Jenkins 运行 PowerShell 脚本 但它似乎完全忽略了执行策略 可以通过直接执行 powershell exe 或使用PowerShell插件 https wiki jenkins ci org display
  • 如何在一行中输出多个变量

    我试图确定 CSV 中的用户是否处于活动状态 此外 我想知道它们是否是服务帐户 用户帐户或基于 OU 的计算机帐户 一切都在膨胀 直到我尝试输出它 输出分为几行 每个变量一行 我希望输出在一行上 中间有逗号 这样我完成后就会有一个 CSV
  • 自动递增 EC2 实例名称

    我在 Stackoverflow 上看到很多问题 询问是否有办法自动递增实例名称 例如 foo1 foo2 fooN 我想看看是否有办法在 Powershell 中执行此操作 我正在使用 AutoLaunchConfiguration AS
  • Azure 函数核心工具安装卡在 Visual Studio Code 中

    我创建了 Azure 函数应用程序来执行 powershell 脚本 想先在我的本地运行它来测试它 当我运行它时 无论有没有调试选项 都会出现一个弹出窗口 其中显示 您必须安装 Azure Functions 核心工具才能调试本地函数 当我
  • 通过 PowerShell 对 TFS 构建进行排队

    TFS2012 具有一个 2010 构建控制器和一个 2010 构建代理 还有一个 2012 构建控制器和多个 2012 构建代理 我们的软件有多个版本的多个版本 构建根据约定命名 例如Foo version 1 0 和 Foo versi
  • PowerShell 和 StringBuilder

    我是 PowerShell 新手 但熟悉 NET 类 我在用System Text StringBuilder在 PowerShell 脚本中 脚本是这样的 Function MyStringFunc String line r New O
  • Powershell Invoke-Command 远程手动工作,但不能通过 Jenkins

    我遇到了一个非常奇怪的情况 即从 Windows Server 2012 R2 手动运行相同的命令时可以工作 但从同一服务器上运行的 Jenkins 从属进程无法工作 首先 手动运行的输出 管理 PowerShell 窗口 PS C Use
  • PowerShell 模块中忽略 Write-Verbose

    我希望使用Write Verbose脚本和函数中的命令行开关 它在脚本 ps1 文件中按预期工作 但在模块 psm1 文件中则不然 该 commandlet 在模块中被忽略 运行以下脚本 PS gt scaffold ps1 verbose
  • 从 PowerShell 运行 SSIS 包,无需部署项目

    This https learn microsoft com en us sql integration services ssis quickstart run powershell view sql server ver16 ssis
  • Powershell XMLDocument保存为无BOM的UTF-8

    我构建了一个 System Xml XmlDocument 类型的 XML 对象 scheme gettype IsPublic IsSerial Name BaseType True False XmlDocument System Xm
  • Powershell tail 多个文件命令

    我可以通过以下命令尾随一个文件 Get Content Path C log1 txt Tail 10 Wait 如何将其扩展到多个文件 我尝试了以下方法但没有成功 Get Content Path C log1 txt C log2 tx
  • Delphi 5 的哈希表实现 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 您知道 Delphi 5 的良好且免费的哈希表实现吗 我需要在哈希表中组织大量数据 并且我有点担心在网
  • powershell stdin 管道和重定向

    你好 我一直在制作一个小的跨平台脚 本 我可以将其卷曲并通过管道传输到bash和Powershell中 基本思想是服务器向解释器发送一个命令 然后它给出一个命令将所有输出重定向到标准输出 bash 中的一个例子是 some commands
  • Pester 没有捕获抛出的错误

    当我运行以下纠缠测试时 我希望它能够捕获预期的错误 但事实并非如此 但是 当我使用不同的函数和不同的 throw 语句运行测试时 它会起作用 纠缠测试 Describe Remove GenericCredential Function T
  • 在powershell中,使用export-csv cmdlet,我的整数被引号封装,知道为什么吗?

    所以我运行一个sql查询 通过管道传输到export csv 唯一的问题是所有值都用引号封装 包括整数 这对我来说不可能作为整数重新导入到SQL中 有什么想法吗 CSV 没有类型的概念 它是纯粹基于字符串的格式 PowerShell 只引用
  • 如何从 C# 运行 PowerShell 脚本

    我正在尝试使用 C 运行 PowerShell 脚本 但没有成功 这是我的功能 private void ExecutePowerShellCommand string scriptfile RunspaceConfiguration ru
  • 如何从 -WhatIf 处理中排除块?

    我正在编写一个 Powershell cmdlet 它需要执行命令并将其 stderr 输出存储到临时文件中以供以后处理 此输出列出了 cmdlet 稍后可能使用的 COM 端口 mostly side effect free inform
  • netsh 结果到 PowerShell 对象

    我正在尝试与NETSH https ss64 com nt netsh html来自 PowerShell 我想看到这个命令的结果 例如一个对象 但是netsh返回一个字符串 netsh wlan show hostednetwork Ge
  • Powershell 将单个字符串与多个正则表达式匹配?

    除了依次迭代每个正则表达式之外 是否有一种更 powershelly 的方式将单个字符串与正则表达式的数组 集合进行匹配 我真正想做的是这样的 database Name match includeRegexArray 考虑到 Powers
  • 通过 PowerShell 运行 .cmd 文件

    我正在尝试使用 PowerShell 在远程服务器上运行 cmd 文件 在我的 ps1 脚本中我尝试过 C MyDirectory MyCommand cmd 它会导致此错误 C MyDirectory MyCommand cmd is n

随机推荐