使用 $httpBackend 测试 $resource 的 PUT/POST 方法时出错
Error when testing PUT/POST methods of $resource using $httpBackend
我在尝试测试使用 $resource 设置并具有各种方法 GET、PUT、POST.
的服务时遇到问题
我在我的测试中使用 $httpBackend,它在测试 GET 请求时工作正常但在 PUT/POST 上失败 - 我认为这可能是因为它首先发送了一个 OPTIONS 请求。
奇怪的是,如果我将工厂更改为使用 $http.post() 而不是 $resource,测试会顺利通过。
有人知道解决这个问题的方法吗?我可以关闭 OPTIONS 请求吗?或者什么...?
谢谢!
服务
angular.module('myApp')
.factory('Reports', function ($resource, ApiConfig) {
return $resource(ApiConfig.urlBase + "/protected/HttpResource/:id",{},{
update: {method: 'PUT'},
get: {method: 'GET',isArray: true},
search: {method: 'GET',isArray: false},
save: {method: 'POST'}
});
});
ApiConfig.urlBase 在测试中解析为 http://localhost:8080/...
测试文件
describe("Reports", function() {
beforeEach(module("myApp"));
beforeEach(inject(function(_Reports_, _$httpBackend_, _ApiConfig_) {
Reports = _Reports_;
$httpBackend = _$httpBackend_;
ApiConfig = _ApiConfig_;
}));
afterEach(function() {
$httpBackend.verifyNoOutstandingExpectation();
$httpBackend.verifyNoOutstandingRequest();
});
describe("save method", function() {
var report = {name: "TestReport", type: "HttpResource"};
beforeEach(function() {
url = ApiConfig.urlBase + "/protected/HttpResource/";
$httpBackend.when("POST", url).respond();
});
it("should make POST request when save method called", function() {
$httpBackend.expectPOST(url);
Reports.save(report);
$httpBackend.flush();
});
});
});
好的,所以我设法让它工作了,它与选项无关,只是与我正在检查的URL有关。
$resource 默认设置为自动去除尾部斜杠 - 您可以关闭它(请参阅 $resource 的 Angular 文档)或者我只是在测试 URL 中更改了 class 并删除了最后一个“/”。
beforeEach(function() {
url = ApiConfig.urlBase + "/protected/HttpResource";
$httpBackend.when("POST", url).respond();
});
我的 PUT 请求使用与上面相同的 URL,这让我困惑了一段时间,因为我期待我正在传递的 id 用于 URL。
也许这对其他人有帮助:)
我在尝试测试使用 $resource 设置并具有各种方法 GET、PUT、POST.
的服务时遇到问题我在我的测试中使用 $httpBackend,它在测试 GET 请求时工作正常但在 PUT/POST 上失败 - 我认为这可能是因为它首先发送了一个 OPTIONS 请求。
奇怪的是,如果我将工厂更改为使用 $http.post() 而不是 $resource,测试会顺利通过。
有人知道解决这个问题的方法吗?我可以关闭 OPTIONS 请求吗?或者什么...?
谢谢!
服务
angular.module('myApp')
.factory('Reports', function ($resource, ApiConfig) {
return $resource(ApiConfig.urlBase + "/protected/HttpResource/:id",{},{
update: {method: 'PUT'},
get: {method: 'GET',isArray: true},
search: {method: 'GET',isArray: false},
save: {method: 'POST'}
});
});
ApiConfig.urlBase 在测试中解析为 http://localhost:8080/...
测试文件
describe("Reports", function() {
beforeEach(module("myApp"));
beforeEach(inject(function(_Reports_, _$httpBackend_, _ApiConfig_) {
Reports = _Reports_;
$httpBackend = _$httpBackend_;
ApiConfig = _ApiConfig_;
}));
afterEach(function() {
$httpBackend.verifyNoOutstandingExpectation();
$httpBackend.verifyNoOutstandingRequest();
});
describe("save method", function() {
var report = {name: "TestReport", type: "HttpResource"};
beforeEach(function() {
url = ApiConfig.urlBase + "/protected/HttpResource/";
$httpBackend.when("POST", url).respond();
});
it("should make POST request when save method called", function() {
$httpBackend.expectPOST(url);
Reports.save(report);
$httpBackend.flush();
});
});
});
好的,所以我设法让它工作了,它与选项无关,只是与我正在检查的URL有关。
$resource 默认设置为自动去除尾部斜杠 - 您可以关闭它(请参阅 $resource 的 Angular 文档)或者我只是在测试 URL 中更改了 class 并删除了最后一个“/”。
beforeEach(function() {
url = ApiConfig.urlBase + "/protected/HttpResource";
$httpBackend.when("POST", url).respond();
});
我的 PUT 请求使用与上面相同的 URL,这让我困惑了一段时间,因为我期待我正在传递的 id 用于 URL。
也许这对其他人有帮助:)