5

我有一个 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 的东西,路由器的初始化程序等。

4

1 回答 1

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。

于 2013-08-05T10:02:45.713 回答