如何在Backbone View上测试route.navigate

时间:2015-04-22 22:07:19

标签: backbone.js mocha sinon chai

我目前正在开发一个Backbone.js应用程序,该应用程序使用Mocha,Chai和Sinon库进行测试。我正在努力编写以下测试代码:当用户点击按钮时,它应该将用户重定向到家。

以下是视图的外观:

events: {
    'click #navigate-home': 'goHome'
},

initialize: function(options) {
    this.router = options.router;
},

goHome: function(event) {
  event.preventDefault();
  this.router.navigate('home', { trigger: true });
}

以下是测试:

beforeEach(function() {
  this.router = new Backbone.Router();
  this.myView = new MyView({
    router: this.router
  });
  this.myView.render();
});

afterEach(function() {
  this.router = null;
  this.myView = null;
});

it('redirects to home', sinon.test(function() {
  var spy = sinon.spy();
  this.router.on({
    'home': spy
  });
  this.myView.$el.find('#navigate-home').trigger('click');
  expect(spy.called).to.be.true;
}));

代码在浏览器上按预期工作,但我无法通过测试。我非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

基于我在Backbone和Unit Testing方面的经验,我认为这种测试是无效的测试用例。

您尝试测试的不是实际的代码,而是尝试为Backbone库添加测试用例。类似的测试用例实际上应该是您的自动化的一部分(阅读Selenium)。

我认为在你的案例中编写单元测试的正确方法是:

it('should redirect to home', sinon.test(function() {
  var spy = sinon.spy();
  this.router.on({
    'home': spy
  });

  // This is the difference
  this.myView.goHome({preventDefault: function() { } });

  expect(spy.called).to.be.true;
});