angularjs – 如何使用karma / jasmine模拟angularAMD中的服务?

我有一个使用AngularaMD / RequireJS / Karma / Jasmine的项目,我的基本配置全部工作,大多数单元测试运行并成功通过.

我无法使用angular.mock.module或angularaMD.value()正确注入模拟服务.

我有

// service deFinition in services/MyService.js
define(['app'],function(app) {
           app.factory('myService',[ '$document',function($document) {
               function add(html) {
                   $document.find('body').append(html);
               }
               return { add: add }; 
           }]);
       }
);


// test
define(['angularaMD','angular-mocks','app','services/MyService'],function(aamd,mocks,app) {
           describe('MyService',function() {
               var myBodyMock = {
                   append: function() {}
               };
               var myDocumentMock = {
                   find: function(sel) {
                       // this never gets called 
                       console.log('selector: ' + sel);
                       return myBodyMock; 
                   }
               }; 
               var svc;
               beforeEach(function() {
                   // try standard way to mock a service through ng-mock
                   mocks.module(function($provide) {
                       $provide.value('$document',myDocumentMock);
                   });
                   // hedge my bets - try overriding in aamd as well as ng-mock
                   aamd.value('$document',myDocumentMock);              
               });
               beforeEach(function() { 
                   aamd.inject(['myService',function(myService) {
                                   svc = myService;
                               }]);
               });
               it('should work',function() {
                   // use svc expecting it to have injected mock of $document.
                   spyOn(myDocumentMock,'find').andCallThrough();
                   spyOn(myBodyMock,'append');
                   svc.add('<p></p>');
                   expect(myDocumentMock.find).toHaveBeenCalledWith('body');
                   expect(myBockMock.append).toHaveBeenCalledWith('<p></p>');
               });
           });
       }
);

有谁知道我哪里出错了?任何帮助将非常感激.

Angular不是异步的,我认为不是一个好的意识形态同时使用.如果你正试图达到一个好的模块化方法,好吧,但是在你把它放到浏览器之前使用RequireJS优化器构建所有内容,关于测试,我认为你可以使用RequireJS优化器来构建你的模块,即使在测试中,它也可以让你摆脱“Commonjs环境”.

相关文章

ANGULAR.JS:NG-SELECTANDNG-OPTIONSPS:其实看英文文档比看中...
AngularJS中使用Chart.js制折线图与饼图实例  Chart.js 是...
IE浏览器兼容性后续前言 继续尝试解决IE浏览器兼容性问题,...
Angular实现下拉菜单多选写这篇文章时,引用文章地址如下:h...
在AngularJS应用中集成科大讯飞语音输入功能前言 根据项目...
Angular数据更新不及时问题探讨前言 在修复控制角标正确变...