2016-03-10 10 views
3

Я пытаюсь написать тест с использованием AVA, но я не могу заставить его писать. fn передает функцию обратного вызова через все мои функции и вызывает ее, когда все делается. Мой тестПроблемы с тестированием AVA

import test from 'ava'; 
import fn from './index.js'; 

test('NonLiteral && Literal', function (t) { 
    fn('test.txt', '', function (res) { 
    console.log(res); 
    t.is(res, ''); 
    }); 
}); 

УЭ является

This is a test 
How is it going 
So far!!! 

, но он говорит, что мой тест проходит. Я следовал this тестам. Вот фрагмент, который я искал

test('throwing a named function will report the to the console', function (t) { 
    execCli('fixture/throw-named-function.js', function (err, stdout, stderr) { 
     t.ok(err); 
     t.match(stderr, /\[Function: fooFn]/); 
     // TODO(jamestalmage) 
     // t.ok(/1 uncaught exception[^s]/.test(stdout)); 
     t.end(); 
    }); 
}); 

Может кто-нибудь объяснить мне, что я делаю неправильно?

ответ

6

Извините за замешательство, к сожалению, этот юнит-тест, который вы ищете, использует tap, а не AVA. (AVA не использует себя для тестирования ... пока).

Я предполагаю, что fn является асинхронным. В этом случае вы, вероятно, захотите использовать test.cb.

test.cb('NonLiteral && Literal', function (t) { 
    fn('test.txt', '', function (res) { 
     console.log(res); 
     t.is(res, ''); 
     t.end(); 
    }); 
}); 

Теперь, похоже, может быть fn позвонит, что обратный вызов более чем один раз, но это ошибка вызвать более t.end(), чем один раз. Если это так, то вам нужно будет сделать что-то вроде этого:

test.cb('NonLiteral && Literal', function (t) { 
    var expected = ['foo', 'bar', 'baz']; 
    var i = 0; 
    fn('test.txt', '', function (res) { 
     t.is(res, expected[i]); 
     i++; 
     if (i >= expected.length) { 
      t.end(); 
     } 
    }); 
}); 

Наконец, я хотел бы призвать Вас рассмотреть возможность реализации API на основе Promise, так что вы можете воспользоваться async функций и await ключевого слова. В результате получается намного более чистый код, чем обратные вызовы. В ситуациях, когда вы хотите вызвать обратный вызов несколько раз, рассмотрите Observables. Стратегии тестирования для обоих документированы в документах AVA. Дополнительная информация о Observables довольно легко найти в Google.

Спасибо за попытку AVA. Держите эти вопросы!

+0

Я заметил, что он использовал кран, и это помогло разобраться. Я закончил тем, что выяснил первое предложенное вами решение. Я также попытался переделать свой код с обещаниями, но поскольку я буквально сейчас изучаю их, я еще не получил эту работу. Спасибо за ответ, гораздо глубже, чем то, на что я собираюсь ответить. – SirParselot

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