2012.05.22
社内勉強会
function isWithinDate(start, end) {
var now = Date.now();
var start = +new Date(start);
var end = +new Date(end);
return start < now && now < end;
}
// こんな感じで使う
isWithinDate('2012/05/10', '2012/05/30'); //=> true
ok( isWithinDate('2012/05/10', '2012/05/30') );
今日は通るけど6月になったらこけちゃうよ!
// テストコード
var clock = sinon.useFakeTimers(+new Date('2012/05/13'));
ok( isWithinDate('2012/05/10', '2012/05/30') );
clock.restore();
現在時刻を強制変更
function confirmAndRemove($elem) {
if (window.confirm('ok?')) {
$elem.remove();
}
}
どうやってテストする?
ということ(下二つが特に重要)
var $elem = $('<div>');
var stubConfirm = sinon.stub(window, 'confirm');
stubConfirm.returns(true);
// テスト対象の関数呼び出し
confirmAndRemove($div);
// テスト
ok( stubConfirm.calledOnce );
ok( stubConfirm.calledWith('ok?') );
// 後始末
stubConfirm.restore();
var $elem = $('<div>');
var stubConfirm = sinon.stub(window, 'confirm');
stubConfirm.returns(true);
// テスト対象の関数呼び出し
confirmAndRemove($div);
// テスト
ok( stubConfirm.calledOnce );
ok( stubConfirm.calledWith('ok?') );
// 後始末
stubConfirm.restore();
var $elem = $('<div>');
var stubConfirm = sinon.stub(window, 'confirm');
stubConfirm.returns(true);
// テスト対象の関数呼び出し
confirmAndRemove($div);
// テスト
ok( stubConfirm.calledOnce );
ok( stubConfirm.calledWith('ok?') );
// 後始末
stubConfirm.restore();
var $div = $('<div>');
var stubConfirm = sinon.stub(window, 'confirm');
var spyRemove = sinon.spy($div, 'remove');
stubConfirm.returns(true);
// テスト対象の関数呼び出し
confirmAndRemove($div);
// テスト
ok( stubConfirm.calledOnce );
ok( stubConfirm.calledWith('ok?') );
ok( spyRemove.calledOnce );
ok( spyRemove.calledWith(undefined) );
// 後始末
stubConfirm.restore();
spyRemove.restore();
var $div = $('<div>');
var stubConfirm = sinon.stub(window, 'confirm');
var spyRemove = sinon.spy($div, 'remove');
stubConfirm.returns(true);
// テスト対象の関数呼び出し
confirmAndRemove($div);
// テスト
ok( stubConfirm.calledOnce );
ok( stubConfirm.calledWith('ok?') );
ok( spyRemove.calledOnce );
ok( spyRemove.calledWith(undefined) );
// 後始末
stubConfirm.restore();
spyRemove.restore();
var $div = $('<div>');
var stubConfirm = sinon.stub(window, 'confirm');
var spyRemove = sinon.spy($div, 'remove');
stubConfirm.returns(false);
// テスト対象の関数呼び出し
confirmAndRemove($div);
// テスト
ok( stubConfirm.calledOnce );
ok( stubConfirm.calledWith('ok?') );
ok( !spyRemove.called );
// 後始末
stubConfirm.restore();
spyRemove.restore();
function fetch(url) {
var d = $.Deferred();
$.ajax({
url: url,
dataType: 'json'
}).done(function(data) {
if (data.error) {
d.reject(data.error);
}
else {
d.resolve(data.result);
}
}).fail(function() {
d.reject('ajax error');
});
return d;
}
function fetch(url) {
var d = $.Deferred();
$.ajax({
url: url,
dataType: 'json'
}).done(function(data) {
if (data.error) {
d.reject(data.error);
}
else {
d.resolve(data.result);
}
}).fail(function() {
d.reject('ajax error');
});
return d;
}
var stubAjax = sinon.stub(jQuery, 'ajax');
stubAjax.returns( $.Deferred().resolve({ result: 'ok' }) );
fetch('/api/list').done(function(result) {
ok( stubAjax.calledOnce );
ok( stubAjax.calledWith({ url: '/api/list', dataType: 'json' }) );
ok( result === 'ok' );
}).fail(function() {
ok( false );
}).always(function() {
stubAjax.restore();
});
var stubAjax = sinon.stub(jQuery, 'ajax');
stubAjax.returns( $.Deferred().resolve({ error: 'err!' }) );
fetch('/api/list').done(function(result) {
ok( false );
}).fail(function(error) {
ok( stubAjax.calledOnce );
ok( stubAjax.calledWith({ url: '/api/list', dataType: 'json' }) );
ok( error === 'err!' );
}).always(function() {
stubAjax.restore();
});
var stubAjax = sinon.stub(jQuery, 'ajax');
stubAjax.returns( $.Deferred().reject() );
fetch('/api/list').done(function(result) {
ok( false );
}).fail(function(error) {
ok( stubAjax.calledOnce );
ok( stubAjax.calledWith({ url: '/api/list', dataType: 'json' }) );
ok( error === 'ajax error' );
}).always(function() {
stubAjax.restore();
});