我正在使用Jasmine Jquery进行单元测试。我有以下代码:
(function() {
$(document).ready(copyToClipboard);
function copyToClipboard(){
var clipboard = new Clipboard('#d_clip');
clipboard.on('success', function(e) {
$(e.trigger).text("Copied!");
e.clearSelection();
setTimeout(function() {
$(e.trigger).text("Copy");
}, 2500);
});
clipboard.on('error', function(e) {
$(e.trigger).text("Error copying");
setTimeout(function() {
$(e.trigger).text("Copy");
}, 2500);
});
}
})();
我已经尝试过:
beforeEach(function() {
setFixtures("<button type='button' id='d_clip'>Copy</button>")
clipboard = new Clipboard('#d_clip');
});
it('should change text to copied', function() {
spyOn(clipboard,'on');
$('#d_clip').trigger('click');
expect($('#d_clip').text()).toEqual('Copied!')
});
但是我收到了这个错误:
预期&#39;复制&#39;等于复制!&#39;。
我手动点击时有效。当我在Chrome Developer Console上$('#d_clip').trigger('click');
时,它也可以使用。
看起来剪贴板没有为单元测试做任何事情。我无法弄清楚如何做到这一点。
我想测试什么?
这是在Ruby on Rails上,所以我运行JS单元测试:
rake jasmine:ci
答案 0 :(得分:1)
要直接回答您的问题,我会尝试jasmine's done()
callback。它允许您的规范是异步的。 (请注意,间谍是不必要的。)
format_suffix_patterns
但是,从样式的角度来看,我建议你将它分成两个较小的规格,一个测试是否从it("should change text to 'copied'", function(done) {
$('#d_clip').trigger('click');
clipboard.on('success', function() {
expect($('#d_clip').text()).toEqual('Copied!')
done();
});
});
调用触发器,另一个直接调用你的回调(提取它是一个变量)并检查它是否更新了值。结合这两者感觉就像是对我的整合测试。