mrb*_*rdo 5 coffeescript backbone.js jasmine sinon marionette
我有一个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
Run Code Online (Sandbox Code Playgroud)
我不确定如何与App(window.MyApp)隔离测试.我想基本上触发"#dashboard"路由并断言showDashboard被调用,而不必让整个应用程序参与其中.我们正在使用Rails资产管道(因此没有RequireJS),因此所有JS文件都在start时加载.我认为可行的方法是以某种方式模拟此模块中使用的App对象,但我对任何解决方案持开放态度.
我有类似的另一个问题是测试Marionette命令和reqres,例如在我看到的视图中
App.execute("navigate:root")
Run Code Online (Sandbox Code Playgroud)
问题是我不想让真正的应用程序参与规范,我想例如为规范制作一个新的Marionette.Application.该视图位于一个模块中,该模块的定义方式与我在第一个代码示例中显示的方式相同.
基本上我想避免在规范中使用真正的应用程序,并使用模拟或(可能更好/更容易)只是一个新的Marionette.Application.因此,在事物通过应用程序对象的所有情况下,这对我来说都很有用,例如Wreqr的东西,路由器的初始化器等.
您应该使用 sinonJs 进行存根。
第一个测试应该实例化 Router,然后存根 Controller showDashboard 方法。
@router = new App.DashboardApp.Router
@showDashboardStub = sinon.stub @router.controller, 'showDashboard'
@router.navigate "dashboard", {trigger: true}
Run Code Online (Sandbox Code Playgroud)
以及它被称为的测试
expect(@showDashboardStub).toHaveBeenCalled()
Run Code Online (Sandbox Code Playgroud)
第二个测试取决于您是否要测试正在调用执行的命令或正在处理的命令。第一种情况是实例化执行器和存根 App.execute,第二种情况是实例化处理命令的类并调用 App.execute。