所以,我正在为一个函数编写一个单元测试。 技术细节并不重要,但为了清楚起见,我想分享一些代码 这是功能:
export function getSalutations(lang: Salutation = Salutation.default): string[] {
return SALUTATIONS[lang] || SALUTATIONS.default;
};
export const enum Salutation {
de,
es,
default
};
const SALUTATIONS = {
de: ['Hr.', 'Fr.'],
es: ['Sr.', 'Sra.'],
default: ['Mr.', 'Mrs.', 'Ms.']
};
单元测试的一个例子:
QUnit.module('getSalutations', (hooks) => {
QUnit.test('null / default salutations', (assert) => {
assert.ok(DW.Utils.isEqual(DW.Utils.getSalutations(null), ['Mr.', 'Mrs.', 'Ms.']));
});
});
我不想像这样复制数据,以便测试方法。我想重用SALUTATIONS
进行测试,因此没有冗余代码。问题是我无法使用它,因为它不是从它所在的范围导出的,所以我无法访问它。
所以我被置于以下选择之前:
我对这两者都不满意,所以我希望有人可以告诉我什么是最佳解决方案。也许还有其他选择,我无法弄清楚?
谢谢!
答案 0 :(得分:2)
出于主观原因,这个问题可能会被关闭,但无论如何我都会回答。
您的代码是抽象的地方。
您的测试是结核的地方。
这意味着,如果您正在测试应用程序默认情况下会写Hello Mr Smith
而德语会编写Hallo Herr Smith
- 您应该在测试中使用这些字符串,因为它们是具体的示例。预期产出。
如果使用SALUTATIONS
对象构造测试的字符串,我可以在不破坏任何测试的情况下执行此操作:
const SALUTATIONS = {
de: ['Hr.', 'Fr.'],
es: ['Sr.', 'Sra.'],
default: ['Whatever.', 'I quit.', 'I hate my job.']
};
答案 1 :(得分:2)
有些人可能认为这是一个基于意见的问题(正如@Fenton建议的那样),但我看到了你的困境,JS世界中的许多人都有这种困境。我的建议是重复测试中的值。您需要确定您正在测试的内容...而您似乎正在测试的是这些值将从getSalutations
方法返回。如果是这种情况,那么你可以测试三件事:
所以现在你必须决定你要测试哪一个,如果它是第三个(在这种情况下它真的是全部三个),那么你应该重复测试中的值。如果有人添加了新值,那么您的测试应该更新,因为它可能是无效的值。
只需2美分。