问题
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