Сбой ava-тестов проходит при добавлении оператора console.log - PullRequest
0 голосов
/ 29 июня 2018

Вот проверяемая функция:

const delimitedBinary = /^(?:[01]{8} ){3,}$/gm;
const nonDelimitedBinary = /^(?:[01]{8}){3,}$/gm;
const byteRegex = /[01]{8}/gm;

function decode(string) {
    string = string.trim();
    let bytes;

    if (delimitedBinary.test(string + ' ')) {
        bytes = (string + ' ').match(byteRegex);
    } else if(nonDelimitedBinary.test(string)) {
        bytes = string.match(byteRegex);
    }

    if (bytes) {
        return decodeBytes(bytes);
    }

    return '';
}

function decodeBytes(bytes) {
    return utf.getStringFromBytes(bytes.map(byte => parseInt(byte, 2)));
}

У меня есть несколько тестов в test/tests.js. Вот выдержка:

test('Decodes binary on separate line', t => {
    t.is(app.decode('text \n01110000 01100001 01110011 01110011'), 'pass');
});

test('Decodes emojis', t => {
    t.is(app.decode('11110000 10011111 10001110 10001001'), '?');
});

Первый тест не пройден. При добавлении console.log() к первому тесту как

test('Decodes binary on separate line', t => {
    console.log(app.decode('text \n01110000 01100001 01110011 01110011'));
    t.is(app.decode('text \n01110000 01100001 01110011 01110011'), 'pass');
});

Первый тест сейчас пройден, а второй тест не пройден. При добавлении оператора console.log() также ко второму тесту,

test('Decodes emojis', t => {
    console.log(app.decode('11110000 10011111 10001110 10001001'));
    t.is(app.decode('11110000 10011111 10001110 10001001'), '?');
});

... оба теста пройдены.

Я уверен, что делаю что-то глупое или пропускаю что-то большое время. Я просмотрел документ об общих ошибках Ava и не смог найти ничего подходящего.

1 Ответ

0 голосов
/ 29 июня 2018

Тестовый сценарий работает правильно. Проблема в том, что decode не является чистым, он возвращает разные результаты каждый раз, когда вы вызываете его, и он возвращает только правильный результат при втором вызове. Поэтому, если вы добавите console.log ранее, результат будет правильным, в противном случае он будет ложным:

console.log(
  decode('text \n01110000 01100001 01110011 01110011'),
  decode('text \n01110000 01100001 01110011 01110011')
);

Но почему это происходит? Хорошо, как указано в документах

Как и в случае exec () (или в сочетании с ним), test (), вызываемый несколько раз для одного и того же экземпляра глобального регулярного выражения, будет проходить после предыдущего совпадения.

Регулярное выражение имеет состояние и меняет свое состояние всякий раз, когда вы вызываете .test(), поэтому оно дает разные результаты.

...