如何在 Backbone 视图上测试 route.navigate

How To Test route.navigate on Backbone View

我目前正在开发一个 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;
}));

代码在浏览器上按预期工作,但我无法通过测试。如果有任何帮助,我将不胜感激。

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

您尝试在实际上不是您的代码中测试的内容,而是您尝试为 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;
});