使用 Jasmine 单独测试 Marionette 模块

Posted

技术标签:

【中文标题】使用 Jasmine 单独测试 Marionette 模块【英文标题】:Testing Marionette Modules in isolation with Jasmine 【发布时间】:2013-03-25 06:35:47 【问题描述】:

我有一个 Marionette 项目,类似于http://www.backbonerails.com/ 中描述的设置 我正在使用 Rails、Coffeescript 和 Jasmine/Sinon 作为规范。

我在单独测试模块时遇到问题。一个例子是路由器:

@MyApp.module "DashboardApp", (DashboardApp, App, Backbone, Marionette, $, _) ->

  class DashboardApp.Router extends Marionette.AppRouter
    appRoutes:
      "dashboard" : "showDashboard"

  API =
    showDashboard: ->
      DashboardApp.Show.Controller.showDashboard()

  App.addInitializer ->
    new DashboardApp.Router
      controller: API

我不确定如何独立于应用程序 (window.MyApp) 进行测试。我想基本上触发“#dashboard”路由并断言 showDashboard 被调用,而不必让整个应用程序参与其中。我们使用的是 Rails 资产管道(所以没有 RequireJS),所以所有的 JS 文件都是在启动时加载的。我认为可行的方法是以某种方式模拟此模块中使用的 App 对象,但我愿意接受任何解决方案。

我同样遇到的另一个问题是测试 Marionette 命令和要求,例如在我拥有的视图中

App.execute("navigate:root")

同样的问题是我不想让真正的应用程序参与规范,我想例如为规范制作一个新的 Marionette.Application。该视图位于一个模块中,其定义方式与我在第一个代码示例中显示的方式相同。

基本上,我想避免在规范中使用真正的应用程序,而是使用模拟或(可能更好/更容易)只是一个新的 Marionette.Application。所以这对我来说在所有通过应用程序对象的情况下都很有用,例如 Wreqr 的东西、路由器的初始化程序等。

【问题讨论】:

【参考方案1】:

你应该使用 sinonJs 存根。

第一个测试应该实例化路由器,然后存根控制器的 showDashboard 方法。

@router = new App.DashboardApp.Router
@showDashboardStub = sinon.stub @router.controller, 'showDashboard'
@router.navigate "dashboard", trigger: true

以及它被调用的测试

expect(@showDashboardStub).toHaveBeenCalled()

第二个测试取决于您是要测试被调用执行的命令还是正在处理的命令。第一种情况是实例化执行器和存根 App.execute,第二种情况是实例化处理命令的类并调用 App.execute。

【讨论】:

以上是关于使用 Jasmine 单独测试 Marionette 模块的主要内容,如果未能解决你的问题,请参考以下文章

使用 Jasmine 测试 Node 项目

如何测试使用 jasmine + TypeScript 使用常量调用的函数

使用 Jasmine 和 TypeScript 进行单元测试

使用jasmine来对js进行单元测试

使用 Jasmine 进行异步测试

在Visual Studio 2013中使用Jasmine + Karma进行AngularJS测试