How to mock router state in ember + jasmine

六眼飞鱼酱① 提交于 2019-12-08 03:10:19

问题


In my jasmine test suite I want to navigate my router to the right state. Something like this:

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

but if I do so, I get an Cannot call method 'disconnectOutlet' of undefined error. That happens cuz I am calling

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

at this router transition. I tried somehow to init my applicationController like

applicationController = App.ApplicationController.create();

but it doesnt change the error. So how can I mock to be in the right router state?


回答1:


How are you testing this with jasmine today? Are you going to the browse with each change or trying to run it from the command line with something like jasmine-phantom-node / jasmine-node?

One example might look something like the below. In the setup below I'm testing a view but the same mocking / spying ideas apply to the router example you have above.

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 is the jasmine test above in a real project if you want to see it with some context

Here is the view under test (to help make sense of the above jasmine tests)

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', '');
    }
  }
});


来源:https://stackoverflow.com/questions/13688650/how-to-mock-router-state-in-ember-jasmine

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!