I have a controller that uses the dialog from angular -ui / bootstrap:
function ClientFeatureController($dialog, $scope, ClientFeature, Country, FeatureService) { //Get list of client features for selected client (that is set in ClientController) $scope.clientFeatures = ClientFeature.query({clientId: $scope.selected.client.id}, function () { console.log('getting clientfeatures for clientid: ' + $scope.selected.client.id); console.log($scope.clientFeatures); }); //Selected ClientFeature $scope.selectedClientFeature = {}; /** * Edit selected clientFeature. * @param clientFeature */ $scope.editClientFeature = function (clientFeature) { //set selectedClientFeature for data binding $scope.selectedClientFeature = clientFeature; var dialogOpts = { templateUrl: 'partials/clients/dialogs/clientfeature-edit.html', controller: 'EditClientFeatureController', resolve: {selectedClientFeature: function () { return clientFeature; } } }; //open dialog box $dialog.dialog(dialogOpts).open().then(function (result) { if (result) { $scope.selectedClientFeature = result; $scope.selectedClientFeature.$save({clientId: $scope.selectedClientFeature.client.id}, function (data, headers) { console.log('saved.'); }, null); } }); }; });
I am almost completely new to testing and realized that maybe I need to check two things:
- A dialog will open when $ scope.editClientFeature () is called
- This $ save is called successfully after closing the dialog box and returns the result
My really confusing test now looks like this:
describe('ClientFeatureController', function () { var scope, $dialog, provider; beforeEach(function () { inject(function ($controller, $httpBackend, $rootScope, _$dialog_) { scope = $rootScope; $dialog = _$dialog_; //mock client scope.selected = {}; scope.selected.client = { id: 23805 }; $httpBackend.whenGET('http://localhost:3001/client/' + scope.selected.client.id + '/clientfeatures').respond(mockClientFeatures); $controller('ClientFeatureController', {$scope: scope}); $httpBackend.flush(); }); }); it('should inject dialog service from angular-ui-bootstrap module', function () { expect($dialog).toBeDefined(); console.log($dialog); //{} }); var dialog; var createDialog = function (opts) { dialog = $dialog.dialog(opts); }; describe('when editing a clientfeature', function () { createDialog({}); console.log(dialog); //undefined // var res; // var d; // beforeEach(function () { // var dialogOpts = { // template: '<div>dummy template</div>' // }; // console.log(dialog); // d = $dialog.dialog(dialogOpts); // d.open(); // }); // // it('should open a dialog when editing a client feature', function () { // expect(d.isOpen()).toBe(true); // }); }); });
The immediate problem is that I cannot create / open a dialog. I get the following error:
Chrome 25.0 (Mac) ClientFeatureController when editing a clientfeature encountered a declaration exception FAILED TypeError: Cannot call method 'dialog' of undefined
It would be great if someone had already written a test for a similar use case and could provide me with an example, since I'm pretty lost.
Thanks, Shaun
javascript angularjs testing jasmine angular-ui
shaunlim Mar 19 '13 at 1:47 2013-03-19 01:47
source share