【发布时间】:2019-11-10 07:52:26
【问题描述】:
我有一个返回比较函数的函数
getComparisonFunction(propertyOfComparison) {
const func = function(a, b){
if ( a[propertyOfComparison] < b[propertyOfComparison] ) {
return -1;
}
if ( a[propertyOfComparison] > b[propertyOfComparison] ) {
return 1;
}
return 0;
};
return func;
}
此方法将在javascript“排序”方法中使用。 例如:
arrayOfObjects.sort(getComparisonFunction('name'));
此方法将按“名称”属性对“arrayOfObjects”进行排序。 方法工作正常,问题是: 我如何将函数调用与不同的参数进行比较
it('should get correct comparison function', function () {
const func = component.getComparisonFunction('testProperty');
const expectedFunc = function(a, b){
if ( a['testProperty'] < b['testProperty'] ) {
return -1;
}
if ( a['testProperty'] > b['testProperty'] ) {
return 1;
}
return 0;
};
expect(func.toString()).toEqual(expectedFunc.toString());
});
这是我现在拥有的,但它不起作用。运行代码后我收到的错误是:
Expected 'function (a, b) {
if (a[propertyOfComparison] < b[propertyOfComparison]) {
return -1;
}
if (a[propertyOfComparison] > b[propertyOfComparison]) {
return 1;
}
return 0;
}' to equal 'function (a, b) {
if (a['testProperty'] < b['testProperty']) {
return -1;
}
if (a['testProperty'] > b['testProperty']) {
return 1;
}
return 0;
}'.
【问题讨论】:
-
检查字符串化函数是非常脆弱的,正如您刚刚经历的那样。通常,您测试行为,并且不要期望额外的换行符或分号或任何无关紧要的东西破坏您的测试。因此,制作一个您知道要如何排序的列表,对其进行排序,然后检查排序顺序是否与您期望的相同。
-
事情是我不想测试比较功能,它工作正常。我现在正在测试“getComparisonFunction()”是否返回我期望的值。
-
我说这是错误的方法。你几乎不想在你尝试的细节级别上测试确切的实现。您测试行为,以便能够更改实现。如果您现在更改实现,您的测试将立即变得毫无价值 - 您可以更改测试,但您不能确定新返回的函数与旧函数的行为方式相同。
-
我明白了,谢谢@VLAZ!您可以发表您的评论作为答案吗?
-
这是打字稿和严格打字可以使这更容易的地方
标签: javascript angular jasmine karma-webpack