我的 Angular 1.3 应用程序正在使用 angular-translate library 。在我的 Karma 测试中,我尝试使用我创建的 Mock 对象来模拟 $translate
提供程序。
模拟对象称为MockTranslate
,它属于myMocks
模块。我没有在问题中包含 MockTranslate
的源代码,因为它与问题无关。
我的测试主题是一个 Controller ,我可以使用以下命令轻松模拟 $translate
:
module('myMocks');
inject(function($controller, MockTranslate) {
$controller("MyController", {
$translate: MockTranslate.create(translations);
});
});
上面的模拟是有效的,但是我更喜欢使用 angular.mock.module
来模拟提供者,例如:
module('myMocks');
module("myModule", function($provide) {
$provide.provider("$translate", function(MockTranslate) {
return MockTranslate.create(translations);
});
});
但是当我运行测试时出现以下错误:
错误:[$injector:modulerr] 无法实例化模块函数 ($provide),原因是:错误:[$injector:unpr] 未知提供者:MockTranslate
如何使用 angular.mock.module
模拟提供者?
最佳答案
如果我正确理解了该任务,那么这里是一个有效的示例:
angular.module('translateApp', [])
.controller('translateCtrl', function ($scope, $translate) {
$scope.translate = function(message) {
return $translate.translate(message);
};
})
.provider({
$translate: function() {
this.$get = function () {
return {
translate: function (msg) {
return 'OriginalTranslate: ' + msg;
}
};
};
}
});
describe('Translate Controller Test', function() {
var mockScope;
var mockTranslate;
beforeEach(module('translateApp', function($provide) {
$provide.provider('MockTranslate', function() {
this.$get = function () {
return {
translate: function (msg) {
return 'MockTranslate: ' + msg;
}
};
}
});
$provide.provider('$translate', function() {
this.$get = function (MockTranslate) {
return {
translate: function (msg) {
return MockTranslate.translate(msg);
}
};
}
});
}));
beforeEach(inject(function($controller, $rootScope, $translate) {
mockScope = $rootScope.$new();
mockTranslate = $translate;
$controller('translateCtrl', {
$scope: mockScope,
$translate: mockTranslate
});
}));
it('Translates messages', function () {
expect(mockScope.translate('cool message')).toEqual('MockTranslate: cool message');
});
});
关于angularjs - 如何模拟提供商,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28009242/