array.sort странно себя ведет с wallaby.js
У меня есть функция, которая создает массив, как, [{index: 1}, {index: 4}, {index: 7}]
, Массив упорядочен по значению индекса объектов. Я сузил область действия функции только до сортировки массива, и валлаби указывает, что порядок массива неправильный, однако Мокко продолжает указывать на прохождение тестов.
Спецификация:
import expect from 'expect';
import sort from './sort';
describe("Given an array", ()=> {
let array;
beforeEach(() => {
array = [
{ index: 7, owner: 1 },
{ index: 2, owner: 1 },
{ index: 3, owner: 1 },
{ index: 5, owner: 1 },
{ index: 1, owner: 1 }
];
});
describe("When sorting the array of elements by id", () => {
let actual;
beforeEach(() => {
actual = sort(array);
});
it('should order the array of objects by ascending id',()=> {
let expected = [
{ index: 1, owner: 1 },
{ index: 2, owner: 1 },
{ index: 3, owner: 1 },
{ index: 5, owner: 1 },
{ index: 7, owner: 1 }
];
expect(actual).toEqual(expected);
});
});
});
Реализация sort.js:
export default function(array){
return array.sort((x, y) => { return x.index > y.index});
}
Мой конфиг wallaby выглядит так:
process.env.NODE_ENV = 'test';
var wallabyWebpack = require('wallaby-webpack');
var packageConfig = require('./package.json');
module.exports = function(wallaby) {
var specFilePattern = 'src/shared/**/*.spec.js';
var srcFilePattern = 'src/shared/**/*.js*';
var babelProcessor = wallaby.compilers.babel(packageConfig['babel']);
var webpackPostProcessor = wallabyWebpack({
resolve: {
extensions: ['', '.js', '.jsx']
}
});
return {
testFramework: 'mocha',
debug: true,
files: [
{ pattern: 'node_modules/babel-polyfill/dist/polyfill.js', instrument: false },
{ pattern: srcFilePattern, load: false },
{ pattern: specFilePattern, ignore: true }
],
tests: [
{ pattern: specFilePattern, load: false }
],
compilers: {
'**/*.js*': babelProcessor
},
postprocessor: webpackPostProcessor,
bootstrap: function(){
window.__moduleBundler.loadTests();
}
};
};
1 ответ
Wallaby.js по умолчанию использует PhantomJs за кулисами, который использует тот же движок JavaScript, что и Safari. И если вы запустите этот фрагмент в Safari Dev Tools:
вы заметите, что он также не сортирует массив, как ожидалось. Chrome Dev Tools покажет вам другой результат:
Так что если вы хотите, чтобы ваш sort
Реализация для работы на всех платформах, вам нужно изменить его, чтобы соответствовать спецификации и возврата 1
, -1
или же 0
в отличие от всего true
или же false
,
Так что если вы переписываете свою функцию сортировки следующим образом:
export default function (array) {
return array.sort((x, y) => {
if (x.index > y.index) {
return 1;
}
if (x.index < y.index) {
return -1;
}
return 0;
});
тогда это будет работать везде. Если вы предпочитаете более короткий (но менее читаемый) способ, вы можете использовать этот:
export default function(array) {
return array.sort((x, y) => +(x.index > y.index) || +(x.index === y.index) - 1);
}
Если по какой-либо причине вы хотели бы поддерживать только те платформы, на которых работает ваш исходный код, и не хотели бы его менять, то я предлагаю переключить стандартный бегунок PhantomJs на электронный бегун, который также поддерживает wallaby. Он использует V8, и ваш оригинальный код прекрасно с ним работает.