javascript - 如何在 ember + jasmine 中模拟路由器状态

标签 javascript ember.js jasmine

在我的 Jasmine 测试套件中,我想将路由器导航到正确的状态。像这样的事情:

   describe("The Router", function(){
        beforeEach(function(){
            router = App.Router.create();
            router.transitionTo('foo.bar');
        }
    });

但如果我这样做,我会收到无法调用未定义的方法“disconnectOutlet”错误。发生这种情况是因为我正在打电话

     bar: Ember.Route.extend({      
        connectOutlets: function(router, context){
          router.get('applicationController').connectOutlet('bla', 'blub');
        }
      }),

在此路由器转换处。我尝试以某种方式初始化我的 applicationController 就像

applicationController = App.ApplicationController.create();

但它并没有改变错误。那么我怎样才能模拟处于正确的路由器状态呢?

最佳答案

你今天如何用 Jasmine 测试这个?您是要浏览每个更改还是尝试使用 jasmine-phantom-node/jasmine-node 之类的东西从命令行运行它?

一个示例可能如下所示。在下面的设置中,我正在测试一个 View ,但相同的模拟/ spy 想法适用于您上面的路由器示例。

require('static/script/vendor/filtersortpage.js');
require('static/script/app/person.js');

describe ("PersonApp.PersonView Tests", function(){

  var sut, router, controller;

  beforeEach(function(){
    sut = PersonApp.PersonView.create();
    router = new Object({send:function(){}});
    controller = PersonApp.PersonController.create({});
    controller.set("target", router);
    sut.set("controller", controller);
  });

  it ("does not invoke send on router when username does not exist", function(){
    var event = {'context': {'username':'', 'set': function(){}}};
    var sendSpy = spyOn(router, 'send');
    sut.addPerson(event);
    expect(sendSpy).not.toHaveBeenCalledWith('addPerson', jasmine.any(String));
  });

  it ("invokes send on router with username when exists", function(){
    var event = {'context': {'username':'foo', 'set': function(){}}};
    var sendSpy = spyOn(router, 'send');
    sut.addPerson(event);
    expect(sendSpy).toHaveBeenCalledWith('addPerson', 'foo');
  });

  it ("does not invoke set context when username does not exist", function(){
    var event = {'context': {'username':'', 'set': function(){}}};
    var setSpy = spyOn(event.context, 'set');
    sut.addPerson(event);
    expect(setSpy).not.toHaveBeenCalledWith('username', jasmine.any(String));
  });

  it ("invokes set context to empty string when username exists", function(){
    var event = {'context': {'username':'foo', 'set': function(){}}};
    var setSpy = spyOn(event.context, 'set');
    sut.addPerson(event);
    expect(setSpy).toHaveBeenCalledWith('username', '');
  });
});

Here如果您想在一些上下文中查看它,上面的 Jasmine 测试是在真实项目中进行的

这是正在测试的 View (以帮助理解上述 Jasmine 测试)

PersonApp.PersonView = Ember.View.extend({
  templateName: 'person',
  addPerson: function(event) {
    var username = event.context.username;
    if (username) {
      this.get('controller.target').send('addPerson', username);
      event.context.set('username', '');
    }
  }
});

关于javascript - 如何在 ember + jasmine 中模拟路由器状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13688650/

相关文章:

javascript - 如何通过 RequireJS 在 AMD 模块中使用 javascript 对象

ember.js - 在 ember-cli 环境中访问窗口对象

javascript - Ember Js 中的复选框

javascript - 在 Protractor For 循环中执行多个 IT block 以进行 Web 测试

javascript - jQuery AJAX 后数组

javascript - 动画不适用于多线图表 D3 v4

javascript - karma Jasmine 没有执行所有测试

javascript - 如何在没有中继器的情况下在表格中查找元素

javascript - 如何在网页中集成 AIML 聊天机器人

javascript - 用于共享数据的 Ember 应用程序 Controller