我目前的做法是我有两个模块:
dashboard
组件,
alertsWarningsData
工厂,与后端连接
我目前的单元测试方法是明确覆盖此服务:
dashboard.component.js
angular.
module('dashboard').
component('dashboard', {
controller: DashboardController,
templateUrl: 'dashboard/dashboard.html'
});
DashboardController.$inject = ['alertsWarningsData'];
function DashboardController(alertsWarningsData) {
var vm = this;
setAlertsWarnings();
function setAlertsWarnings() {
return alertsWarningsData.getAlertsWarnings()
.then(function(data) {
vm.alertsWarnings = data;
return data;
});
}
dashboard.component.spec.js
describe('Dashboard component', () => {
let $componentController;
beforeEach(module('dashboard'));
beforeEach(inject((_$componentController_) => {
$componentController = _$componentController_;
}));
it(`should exist`, (inject(($q) => {
// given
let streamsData = {};
let alertsWarningsData = {};
alertsWarningsData.getAlertsWarnings = function() { return $q.defer().promise };
// when
const dashboardController = $componentController('dashboard', {'alertsWarningsData': alertsWarningsData});
// then
expect(dashboardController).toBeDefined();
})));
});
问题:有没有更好的方法来模拟这项服务?我可以在beforeEach
?
答案 0 :(得分:1)
是
beforeEach(module('dashboard', ($provide) => {
$provide.factory('alertsWarningsData', ($q) => ({
getAlertsWarnings: () => $q.resolve()
}))
});
module
有一个使用value
模拟服务的对象参数,但由于模拟服务应注入$q
,因此可以使用$provide
。
$controller
和$componentController
可以选择模拟每个控制器的依赖关系,但没有必要使用此功能。