Javascript 在(';success';)或(';error';)上触发clipboard.js以对其进行单元测试

Javascript 在(';success';)或(';error';)上触发clipboard.js以对其进行单元测试,javascript,jquery,unit-testing,jasmine,jasmine-jquery,Javascript,Jquery,Unit Testing,Jasmine,Jasmine Jquery,我使用jasminejquery进行单元测试。我有以下代码: (function() { $(document).ready(copyToClipboard); function copyToClipboard(){ var clipboard = new Clipboard('#d_clip'); clipboard.on('success', function(e) { $(e.trigger).text("Copied!"); e.cle

我使用jasminejquery进行单元测试。我有以下代码:

(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!')
  });
beforeach(函数(){
固定装置(“副本”)
剪贴板=新剪贴板(“d#U剪辑”);
});
它('应将文本更改为已复制',函数(){
间谍(剪贴板,'on');
$('d#u clip')。触发器('click');
expect($('d#u clip').text()).toEqual('Copied!')
});
但我得到了这个错误:

“复制”应等于“复制!”

当我手动点击时,它工作。当我执行
$('d#u clip')时,它也可以工作在Chrome开发者控制台上

看起来剪贴板没有为单元测试做任何事情。我不知道该怎么做

我想测试什么?

  • 我想触发单击,确保文本在成功时为“复制!”,在出错时为“复制错误”
  • 这是基于Ruby on Rails的,因此我运行JS单元测试如下:


    rake jasmine:ci

    要直接回答您的问题,我会试试。它允许您的规范是异步的。(请注意,此操作不需要间谍。)


    但是,从样式角度来看,我建议您将其分为两个较小的规范,一个测试触发器是否从
    copyToClipboard()
    调用,另一个直接调用回调(提取它是一个变量)并检查它是否更新值。对我来说,将两者结合起来就像是一个集成测试。

    在没有测试的情况下单击它是否有效,以及它如何运行测试?是的,单击它时有效。它甚至可以在我执行
    $('d#u clip')时工作。我在RubyonRails上做这件事,所以我做了
    rakejasmine:ci
    it("should change text to 'copied'", function(done) {
        $('#d_clip').trigger('click');
        clipboard.on('success', function() {
            expect($('#d_clip').text()).toEqual('Copied!')
            done();
        });
    });