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:

снимок экрана 2016-03-22 в 12 42 21 вечера

вы заметите, что он также не сортирует массив, как ожидалось. Chrome Dev Tools покажет вам другой результат:

снимок экрана 2016-03-22 в 12 42 43 вечера

Так что если вы хотите, чтобы ваш 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, и ваш оригинальный код прекрасно с ним работает.

Другие вопросы по тегам