【发布时间】:2021-06-27 14:28:52
【问题描述】:
我的应用中有这个帮助函数,它告诉我newData 与oldData 相比的变化。
如何重构我的 getChanges 函数以使下面的测试通过? 我想我可能需要让这个函数递归,因为它是从自身内部执行的,但我不完全确定如何实现。
看起来像这样:
getChanges 辅助函数:
export function getChanges(oldData: Record<string, any>, newData: Record<string, any>): any {
return Object.entries(newData).reduce((changes, [key, newVal]) => {
if (JSON.stringify(oldData[key]) === JSON.stringify(newVal)) return changes
changes[key] = newVal
return changes
}, {} as any)
}
在我的实际测试中,我使用 ava 的 deepEqual 来帮助进行比较。 不管出于何种原因,我正在运行的一项测试没有通过。
index.ts 测试 1 通过
import test from 'ava'
import { getChanges } from '../src/comparisonHelpers.js'
test('getChanges - flat', (t) => {
const a = getChanges({}, {})
const b = {}
t.deepEqual(a, b)
t.deepEqual(getChanges({ a: 1 }, { a: 1 }), {})
t.deepEqual(getChanges({ a: 1 }, {}), {})
t.deepEqual(getChanges({}, { a: 1 }), { a: 1 })
const oldData = { a: 1, b: 1, c: 1 }
const newData = { x: 1, a: 1, b: 2 }
const result = getChanges(oldData, newData)
const expect = { x: 1, b: 2 }
t.deepEqual(result, expect)
})
index.ts 测试 2 未通过
import test from 'ava'
import { getChanges } from '../src/comparisonHelpers.js'
test('getChanges - nested difference', (t) => {
const oldData = { nested: { a: 1, b: 1, c: 1 } }
const newData = { nested: { x: 1, a: 1, b: 2 } }
const res = getChanges(oldData, newData)
t.deepEqual(res, { nested: { x: 1, b: 2 } })
})
基本上,如果测试通过,我希望不会返回任何内容,但是此测试会在失败时返回此对象:
{
nested: {
- a: 1,
b: 2,
x: 1,
},
}
我做错了什么导致此测试无法通过?
干杯!
【问题讨论】:
-
你的期望值从哪里来?它不应该包含
c: undefined之类的东西吗? -
我认为您将从this Q&A 中受益。如果您有任何问题,请告诉我。
-
@ScottSauyet 感谢您的回复!现在,这些测试完全与它们所在的文件隔离。现在,预期值是 getChanges 函数中的第二个值(参见我添加的“测试 1”)。测试 1 将事情分解得更好,因为它只是在寻找两者之间的差异。我希望编辑比我的解释更有意义
-
@Thankyou:我正在寻找这个答案。没找到,自己写了第一遍。不过还是太丑了,无法分享。
-
@LovelyAndy:我试图弄清楚为什么你的输出中没有
c?它在第一个值而不是第二个值中。我希望像{nested: {x: 1, b: 2, c: undefined}}或类似的东西。删除c肯定是一个应该注意的变化,不是吗?但是请查看Thankyou 的建议,以获得更强大的样式差异。
标签: javascript typescript recursion helper ava