1

假设我们有一个简单的 Backbone 视图,如下所示:

class MyView extends Backbone.View

    events: 
        'click .save': 'onSave'

    onSave: (event) ->
        event.preventDefault()

        # do something interesting

我想测试当我在课堂上使用我的元素event.preventDefault()时调用它。click.save

我可以测试我的回调函数的实现,就像这样(Mocha + Sinon.js):

it 'prevents default submission', ->
    myView.onSave()

    myView.args[0][0].preventDefault.called.should.be.true

我认为它不起作用,但这只是为了得到这个想法;编写正确的代码,这是可行的。我的问题是这样我正在测试实现而不是功能。

所以,我的问题真的是:我如何验证,假设在我的元素上触发一个click事件?.save

it 'prevents default submission', ->
    myView.$('.save').click()

    # assertion here ??

一如既往地感谢:)

4

2 回答 2

3

尝试在视图的 上添加一个侦听器,然后在 上$el触发,然后验证事件没有冒泡到视图的元素。click.save

var view = new MyView();
var called = false;
function callback() { called = true; }

view.render();

// Attach a listener on the view's element
view.$el.on('click', callback);

// Test
view.$('.save').trigger('click');

// Verify
expect(called).toBeFalsy();
于 2013-08-05T18:10:24.067 回答
2

因此,您想测试生成事件preventDefault时调用的click方法,对吗?

难道你不能做类似的事情(在 JavaScript 中。我会把 CoffeeScript 作为练习;)):

var preventDefaultSpy;

before(function() {
  preventDefaultSpy = sinon.spy(Event.prototype, 'preventDefault');
});

after(function() {
  preventDefaultSpy.restore();
});

it('should call "preventDefault"', function() {
  myView.$('.save').click();
  expect(preventDefaultSpy.callCount).to.equal(1);
});

您可能想preventDefaultSpy.reset()在创建点击事件之前调用,这样调用计数就不会受到其他正在发生的事情的影响。

我没有测试过,但我相信它会起作用。

编辑:换句话说,因为我的回答与你的问题的一部分没有什么不同:我认为你的第一种方法是可以的。通过监视Event.prototype你不要打电话myView,所以它更像是一个黑匣子,这可能会减轻你的一些担忧。

于 2013-08-05T18:07:11.277 回答