[英]unit test template in angular modal service ($uibModal)
我有一个非常简单的service.show(),它使用一些配置基本上调用$ uibModal并返回模式实例
function modalService($uibModal) {
return {
show(message) {
return $uibModal.open({
bindToController: true,
controllerAs: '$ctrl',
template: "<div id='message'>{{$ctrl.message}}</div>",
controller: [function() {
this.message = message;
}]
});
}
}
}
我想编写一个测试来验证实际模态以及是否包含预期的消息。 像这样:
it('should show correct message', (done) => {
modal = modalService.show('hello');
modal.rendered.then(()=> {
expect($('#message').text()).toBe('hello');
done()
});
});
但rendered
承诺是永远不会解决。 我可以做一些变通办法像包裹expect
为$timeout
并做$timeout.flush()
但不知道这是正确的方式,甚至以这种方式我还是不能做一个清理( afterEach
)关闭模式,并准备好测试另一条消息。
正确的方法是打开模式窗口以查找消息并关闭消息,并且由于引导程序将ngAnimate
用于动画,因此我们必须包括ngAnimateMock
模块以刷新挂起的动画。
检查以下代码以获取解决方案:
var myApp = angular.module('myApp', ['ngAnimate', 'ui.bootstrap']); myApp.factory('modalService', ['$uibModal', function($uibModal) { return { show(message) { return $uibModal.open({ bindToController: true, controllerAs: '$ctrl', template: '<div id="message">{{$ctrl.message}}</div>', controller: [function() { this.message = message; }] }); } } }]); describe('modalService service', function() { describe('modalService', function() { var modalService; var $rootScope; var $animate; beforeEach(function() { module('ngAnimateMock') module('uib/template/modal/window.html') module('myApp'); }); beforeEach(inject(function(_$rootScope_, _modalService_, _$animate_) { $rootScope = _$rootScope_; modalService = _modalService_; $animate = _$animate_; })); it('should open the dialog with the correct message', () => { var modal = modalService.show('hello'); $rootScope.$digest(); // Finish the animation. $animate.flush(); expect($('#message').text()).toEqual('hello'); // Close the dialog. modal.close(); $rootScope.$digest(); // Finish the animation. $animate.flush(); }); it('again should show the correct message', () => { var modal = modalService.show('new message'); $rootScope.$digest(); // Finish the animation. $animate.flush(); expect($('#message').text()).toEqual('new message'); // Close the dialog. modal.close(); $rootScope.$digest(); // Finish the animation. $animate.flush(); }); }); });
<body> <!-- because we are testing our controller and not running we don't need a controller or even a module --> <!-- so there is no ng-app or ng-controller in the markup --> <link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/jasmine/2.0.0/jasmine.css"> <!-- the order that these files load is critical, think twice before changing --> <script src="//cdnjs.cloudflare.com/ajax/libs/jasmine/2.0.0/jasmine.js"></script> <script src="//cdnjs.cloudflare.com/ajax/libs/jasmine/2.0.0/jasmine-html.js"></script> <script src="//cdnjs.cloudflare.com/ajax/libs/jasmine/2.0.0/boot.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script> <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.6.1/angular.js"></script> <script src="//ajax.googleapis.com/ajax/libs/angularjs/1.6.1/angular-animate.js"></script> <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.6.1/angular-mocks.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/angular-ui-bootstrap/2.5.0/ui-bootstrap-tpls.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/angular-ui-bootstrap/2.5.0/ui-bootstrap.min.js"></script> <h2>Finished jasmine-unit-test</h2> </body>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.