2015-12-30 1 views
0

Моя проблема очень похожа на this post, но достаточно просто, чтобы принятый ответ не сработал для меня. По сути, у меня есть Угловая фабрика, которая использует компиляцию $, которая возвращает обещание, и я хочу издеваться над ним в Жасмине. Вот упрощенная версия завода:Как насмехаться с функцией компиляции при тестировании фабрики с помощью Jasmine

angular.module('app.common') 
.factory('myFactory', myFactory); 

myFactory.$inject = ['$compile', '$rootScope']; 
function myFactory($compile, $rootScope) { 
    var factory = { 
     testFunc: testFunc 
    } 
    return factory; 

    function testFunc(stuff) { 
     angular.element(document.body).append($compile(stuff)($rootScope)); 
    } 
} 

А вот мой тест:

describe("Common", function() { 
    // I have many common services 
    beforeEach(function() { 
     angular.mock.module('app.common'); 
    }); 

    describe("Factory Example: ", function() { 
     var mockCompile, mockRoot, aFactory; 

     beforeEach(function() { 
      module(function($provide) { 
       $provide.value('$compile', jasmine.createSpy('$compile')); 
       $provide.value('$rootScope', jasmine.createSpy('$rootScope')); 
      }); 
     }); 

     beforeEach(inject(function($compile, $rootScope, myFactory, $q) { 
      mockCompile = $compile; 
      mockCompile = function() { 
       var deferred = $q.defer(); 
       deferred.resolve('remote call result'); 
       return deferred.promise; 
      }; 
      mockRoot = $rootScope; 
      aFactory = myFactory; 
     })); 

     it('should work', function() { 

      aFactory.testFunc('stuff'); 
      expect(true).toBe(true); 
     }); 
    }); 
}); 

Этот код жалуется на меня, что $ компиляции не возвращает обещание. Похоже, что $ provision не знает о назначении новой функции из инъекции. Я взломал его, но я новый для Жасмина, поэтому я не знаю, что я делаю. Любая помощь будет оценена - и если есть более простой способ сделать то, что я пытаюсь сделать, пожалуйста, дайте мне знать!

ответ

1

Хорошо, ура Я решил это!

Для тех, кто может быть заинтересован в будущем: Первой проблемой было то, что я неправильно предполагал, что компиляция $ возвращает обещание, а это не так. Он возвращает функцию, которая принимает область в качестве аргумента. Если вам нужно высмеять функцию, которая возвращает обещание, проверьте this post, который помог мне разобраться, как это сделать.

Конечно, это не сработало для меня, потому что все, что мне нужно было сделать, это мое издеваемое компилирование $ compile. Для меня работал следующий код:

describe("Common", function() { 
// I have many common services 
beforeEach(function() { 
    angular.mock.module('app.common'); 
}); 

describe("Factory Example: ", function() { 
    var mockCompile, mockRoot, aFactory; 

    beforeEach(function() { 
     module(function($provide) { 
      // Just use callFake to have $compile return a function 
      $provide.value('$compile', jasmine.createSpy().and.callFake(function() { 
       return function(scope) { scope(); }; 
      }); 
      $provide.value('$rootScope', jasmine.createSpy()); 
     }); 
    }); 

    beforeEach(inject(function($compile, $rootScope, myFactory, $q) { 
     mockCompile = $compile; 
     mockRoot = $rootScope; 
     aFactory = myFactory; 
    })); 

    it('should work', function() { 

     aFactory.testFunc('stuff'); 
     expect(mockCompile).toHaveBeenCalled(); 
     expect(mockRoot).toHaveBeenCalled(); 
    }); 
}); 
Смежные вопросы