gpt4 book ai didi

testing - 如何在 AngularJS 中为 servicesSpec 和 controllersSpec 定义全局 $httpBackend?

转载 作者:行者123 更新时间:2023-11-28 20:56:04 25 4
gpt4 key购买 nike

我的 Controller 依赖于执行 http 请求的服务。 Controller 和服务测试都需要具有相同数据的 httpBackend。你有什么解决方法吗?

最佳答案

我想你的代码应该是这样的:

angular.module('MyApp', [])
.controller('MyCtrl', function($scope, MyService) {
$scope.doSomething = function() {
MyService.doSomething();
};
})
.service('MyService', function($http) {
$http.get('some-url')
.success(function(response) {
// Handles the response
});
});

为了对 MyCtrl 进行单元测试,您需要模拟其依赖项:$scopeMyService。所以在你的测试中你可以这样做:

describe('MyCtrl', function() {
var MyServiceMock,
scope;

beforeEach(function() {
module('MyApp');

// Creates a mock (spy) for MyService
MyServiceMock = jasmine.createSpyObj('MyService', ['doSomething']);

inject(function($provide) {
// Tells Angular to use MyServiceMock instead of MyService
$provide.value('MyService', MyServiceMock);
});

inject(function($controller, $rootScope) {
scope = $rootScope.$new();
$controller('MyCtrl', { $scope: scope });
});
});

it('calls doSomething of MyService', function() {
$scope.doSomething();
expect(MyServiceMock.doSomething).toHaveBeenCalled();
});
});

这样您就可以测试 MyCtrl 而无需使用 MyService 的实际实例。

我假设您知道如何使用 $httpBackend 服务为 MyService 编写测试,所以我不会在这里发布它的代码。

关于testing - 如何在 AngularJS 中为 servicesSpec 和 controllersSpec 定义全局 $httpBackend?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18210682/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com