使用Jasmine隔离测试Marionette模块

时间:2013-04-03 14:21:14

标签: backbone.js coffeescript jasmine marionette sinon

我有一个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

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

我遇到的另一个问题是测试Marionette命令和reqres,例如我在视图中

App.execute("navigate:root")

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

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

1 个答案:

答案 0 :(得分:4)

你应该与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。