2016-03-15 3 views
1

У меня есть функция, которая строит массив вроде [{index: 1}, {index: 4}, {index: 7}]. Массив упорядочивается по значению индекса объекта. Я сузил область действия функции только для сортировки массива, а wallaby указывает, что порядок массива неверен, однако мокка продолжает указывать проходящие тесты.array.sort ведет себя странно с wallaby.js

Спецификация является:

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}); 
} 

Мой валлаби конфигурации выглядит следующим образом:

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:

screen shot 2016-03-22 at 12 42 21 pm

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

screen shot 2016-03-22 at 12 42 43 pm

Так что, если вы хотите, чтобы ваше sort реализация работать на всех платформах, вам необходимо изменить его, чтобы быть compliant with the spec и вернуть 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 на Electron runner, который также поддерживает wallaby. Он использует V8, и ваш оригинальный код отлично работает с ним.

 Смежные вопросы

  • Нет связанных вопросов^_^