我应该在单元测试时重用封装常量吗?如何重用?
Should I reuse encapsulated constants when unit testing and how?
所以,我正在为一个函数编写单元测试。
技术细节并不重要,但为了清楚起见,我想分享一些代码。
这是函数:
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
,所以没有冗余代码。问题是我不能使用它,因为它不是从它所在的范围导出的,所以我无法访问它。
所以我被放在以下选择之前:
- 我必须将代码复制为模拟数据。
- 我必须公开封装的代码只是为了单元测试
我对两者都不满意,所以我希望有人能告诉我什么是最佳解决方案。也许还有其他选项,我想不通?
谢谢!
由于主观原因,这个问题可能会被关闭,但我还是会回答的。
您的代码是抽象的地方。
您的测试是结核的地方。
这意味着如果您正在测试应用程序将默认编写 Hello Mr Smith
和德语的 Hallo Herr Smith
- 您应该在测试中包含这些字符串,因为它们是具体示例预期输出。
如果您使用 SALUTATIONS
对象构造测试字符串,我可以在不破坏任何测试的情况下执行此操作:
const SALUTATIONS = {
de: ['Hr.', 'Fr.'],
es: ['Sr.', 'Sra.'],
default: ['Whatever.', 'I quit.', 'I hate my job.']
};
有些人可能会争辩说这是一个基于意见的问题(正如@Fenton 所建议的那样),但我看到你的困境,JS 世界中的许多人都有它。我的建议是在测试中重复这些值。您需要确定您正在测试的内容......您正在测试的似乎是这些值将从 getSalutations
方法返回。如果是这样,那么您可以测试三件事:
- 实际上返回了一个数组,
- 该数组中至少有一个条目(或 2 或 20),
- 并且该数组中有特定值。
所以现在您必须决定要测试其中的哪一个,如果是第三个(在这种情况下实际上是所有三个),那么您应该在测试中重复这些值。如果有人添加了新值,那么您的测试应该更新,因为它可能是一个 无效 值。
只是我的 2 美分。
所以,我正在为一个函数编写单元测试。
技术细节并不重要,但为了清楚起见,我想分享一些代码。
这是函数:
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
,所以没有冗余代码。问题是我不能使用它,因为它不是从它所在的范围导出的,所以我无法访问它。
所以我被放在以下选择之前:
- 我必须将代码复制为模拟数据。
- 我必须公开封装的代码只是为了单元测试
我对两者都不满意,所以我希望有人能告诉我什么是最佳解决方案。也许还有其他选项,我想不通?
谢谢!
由于主观原因,这个问题可能会被关闭,但我还是会回答的。
您的代码是抽象的地方。
您的测试是结核的地方。
这意味着如果您正在测试应用程序将默认编写 Hello Mr Smith
和德语的 Hallo Herr Smith
- 您应该在测试中包含这些字符串,因为它们是具体示例预期输出。
如果您使用 SALUTATIONS
对象构造测试字符串,我可以在不破坏任何测试的情况下执行此操作:
const SALUTATIONS = {
de: ['Hr.', 'Fr.'],
es: ['Sr.', 'Sra.'],
default: ['Whatever.', 'I quit.', 'I hate my job.']
};
有些人可能会争辩说这是一个基于意见的问题(正如@Fenton 所建议的那样),但我看到你的困境,JS 世界中的许多人都有它。我的建议是在测试中重复这些值。您需要确定您正在测试的内容......您正在测试的似乎是这些值将从 getSalutations
方法返回。如果是这样,那么您可以测试三件事:
- 实际上返回了一个数组,
- 该数组中至少有一个条目(或 2 或 20),
- 并且该数组中有特定值。
所以现在您必须决定要测试其中的哪一个,如果是第三个(在这种情况下实际上是所有三个),那么您应该在测试中重复这些值。如果有人添加了新值,那么您的测试应该更新,因为它可能是一个 无效 值。
只是我的 2 美分。