【问题标题】:Jest fails for same string玩笑因相同的字符串而失败
【发布时间】:2021-07-02 11:39:39
【问题描述】:

我在一个个人项目中第一次尝试使用 Jest 进行单元测试,即使收到的数据与预期的完全相同,我的一些测试也失败了,这是一个示例:

test("decrypt method works correctly", () =>{
    const myAES = new rijndael("", "0bdfa595235c307a105d593fb78fbb13", { key: "SOME 128 BIT KEY", bits: 128, rounds: 9 })
    expect(myAES.decrypt()).toStrictEqual({
        "c": "0bdfa595235c307a105d593fb78fbb13",
        "p": "ATTACK AT DAWN!",
        "errors": []
    })
}

然后我尝试检查是否是 Jest 或我的代码有问题:

const r = myAES.decrypt()
console.log(typeof r.p) // string
console.log(r.p === "ATTACK AT DAWN!") // false

这让我更加困惑,因为字符串看起来一样。我正在测试的代码是一个 AES 加密函数(别担心它只是一个个人娱乐项目,不会在生产中使用),它将文本处理为 nodeJS Buffers,最后使用 toString()方法将其转换回字符串。我在想这可能是我遇到问题的原因,但似乎无法找到确切的原因。如果有人能指出我正确的方向,我会很高兴,这样我就可以摆脱这个错误。提前谢谢你。

附:我会为大家省去现在阅读我的 AES 实现的痛苦,因为我认为加密不是问题,但如果有必要请告诉我

【问题讨论】:

  • 不确定'p'元素是错误的,你检查过完整的结构吗,因为strictEquals意味着一切都必须匹配。
  • 能否将两者都转换为十六进制,看看两者之间是否有区别。使用可以使用此示例将字符串转储为十六进制 <string>.split('').reduce((h,c)=>h+=c.charCodeAt(0).toString(16).padStart(2,'0'),'')
  • 哦,对了,我早该想到的!我会试一试,谢谢:)

标签: node.js string jestjs buffer


【解决方案1】:

好的,事实证明这是一个愚蠢的错误,我忽略了解密后往往会出现在缓冲区末尾的一系列空字节。虽然 toString() 会将缓冲区转换为我希望计算机不会将其识别为相同字符串的字符串。所以我所要做的就是去掉后面的空字节。假设空字节应该像通常那样只出现在字符串的末尾:

const i = buffer.indexOf(0x00)
const result = buffer.slice(0, i).toString() //solves the problem

【讨论】:

    猜你喜欢
    • 2019-02-15
    • 1970-01-01
    • 2019-01-30
    • 2021-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-13
    • 1970-01-01
    相关资源
    最近更新 更多