この前のブログ記事見た人はごめん。
どこが間違ってるか分かります?
// mayBeRejected()がrejectしたPromiseのエラーを確かめるテスト
it("mayBeRejected()が'woo'でrejectする", function() {
return mayBeRejected().catch(function(error) {
assert(error.message === "woo");
});
});
Chapter.3 Promiseのテストに詳しく書いてあります。 難しいです。
sinon (rolex) とかでsetTimeoutとかは無理やり直列化することもできるけど
it("500ms後にアニメーションが終わる", function() {
var clock = sinon.useFakeTimers();
var el = $("#target");
el.animate({ height: "200px", width: "200px" });
assertEquals("100px", el.css("height"));
assertEquals("100px", el.css("width"));
clock.tick(500);
assertEquals("200px", el.css("height"));
assertEquals("200px", el.css("width"));
});
多分無理。やりかた知ってる人いたら教えて。
assertの回数を数える宗派がいた: tape
var test = require('tape');
test('timing test', function (t) {
t.plan(2);
t.equal(typeof Date.now, 'function');
var start = Date.now();
setTimeout(function () {
t.equal(Date.now() - start, 100);
}, 100);
});
こちらも数える宗派。
QUnit.test("mayBeRejected()が'woo'でrejectする", function(assert) {
assert.expect(2);
return mayBeRejected().catch(function(error) {
assert.ok(error instanceof Error);
assert.ok(error.message === "woo");
});
});
mochaはテストランナーとアサーションライブラリが分離されてる。 自由に組み合わせられる利点はあるが、tapeやQUnitのように密連携できないので、アサートの回数を数えられない。
http://www.slideshare.net/teppeis/javascript-testwhywhathow/33
作った: https://github.com/teppeis/esplan
- アサート回数をカウントできるようにassertパッケージをラップ
- esprimaでAST化したテストコードを走査して
it('title', fn)
を抽出 - テスト関数内部を走査して計画されているアサートの回数をカウント
- テスト関数の先頭にアサート回数を
assert.$$plan()
として挿入 - テストを実行し、計画されたアサート回数に達するかタイムアウトまで待つ
var esplan = require('esplan');
var assert = esplan.register(require('assert'));
describe('Promise', function() {
it('can not detect an assertion error in `then` function', function() {
mayBeResolve().then(function(value) {
assert.equal(value.length, 2);
assert.equal(value[0], 'foo');
assert.equal(value[1], 'bar');
});
});
});
var esplan = require('esplan');
var assert = esplan.register(require('assert'));
describe('Promise', function () {
// `$$done`が引数に追加された
it('can not detect an assertion error in `then` function', function($$done) {
assert.$$plan(this, 3, $$done); // 3回のassertを計画
mayBeResolve().then(function (value) {
assert.equal(value.length, 2);
assert.equal(value[0], 'foo');
assert.equal(value[1], 'bar');
});
});
});
"Timeout!"
じゃないよ!
Error: Expected 3 assertions, but actually 2 assertions called
jQueryのテストでアサート109回とかある。
自動化しよ。
まだPoCなので
- power-assertとの同居(たぶん順番に気をつければできそう)
- よりeasyに(各種環境やビルドツールへの対応)
- source map対応
- 標準assertとmocha BDDスタイル以外への対応
- 適用対象外にする構文
- コンパイルしなくても使える構文
Thanks!