4

假设您希望能够创建一个调用 Backbone.history.start 的 Backbone.Router 实例,销毁它的所有痕迹,然后再次创建它。

我需要这样做以进行单元测试。

问题是创建骨干路由器具有全局意义。就像 Backbone.history 一样,在你创建之前它是未定义的。

var ReversibleRouter = Backbone.Router.extend({
  initialize: function(){
    _buildAppPaths(this.options) // Implementation not shown. Builds the application paths
    Backbone.history.start()
  },
  destroy: function(){
    // TODO: Implement this
  }
})

我希望能够创建和完全销毁,以便我可以对我的应用程序的路由器实现进行一些单元测试。

调用Backbone.history.stop()和设置就足够了Backbone.history = undefined吗?

4

2 回答 2

1

如果您希望进行更多全栈集成类型的测试,您可以使用以下方法重置应用程序的路由器:

Backbone.history.stop()
Backbone.history = undefined // Could also probably use delete here :)

到目前为止,这是成功的——我们的测试可能在我们的 qunit 测试期间实例化并杀死路由器 5 次。效果很好。

也许像@AdamTerlson 这样的嘲笑是长期发展的更好方法,但我仍在学习单元和集成测试理念。不过,我不介意进行一两次完整的堆栈测试。

于 2013-02-24T17:12:59.173 回答
0

这可能是作弊,但我认为您应该在您的测试功能单元之外模拟功能,并特别确保您的单元测试不允许访问实时 DOM、服务器或浏览器。

看看SinonJS,这很好。

这是一个在不影响浏览器历史状态的情况下测试路由器的初始化方法的示例。

test('...', function () {
    // Arrange
    var buildAppPaths = sinon.stub(ReversibleRouter.prototype, '_buildAppPaths');
    var startHistory = sinon.stub(Backbone.history, 'start');
    var options = {};

    // Act
    new ReversibleRouter(options);

    // Assert
    ok(buildAppPaths.calledWith(options));
    ok(startHistory.calledOnce); // or ok(Backbone.history.start.calledOnce);
});

在这种方法下,您已成功断言所有调用都是对外部功能单元(包括参数)进行的。那时,您可以相信外部调用会完成它的工作(通过额外的单元测试证明)。

在这个单元之外进行调用将是进行集成测试而不是单元测试。

于 2013-02-09T03:10:56.937 回答