1

我在尝试测试使用 $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();
    });
});
});
4

1 回答 1

0

好的,所以我设法让它工作,它与 OPTIONS 无关,只是与我正在检查的 URL 有关。

$resource 默认设置为自动去除尾部斜杠 - 您可以将其关闭(请参阅 $resource 的 Angular 文档),或者我只是在测试类中更改了我的 URL 并删除了最后一个“/”。

    beforeEach(function() {
        url = ApiConfig.urlBase + "/protected/HttpResource";
        $httpBackend.when("POST", url).respond();
    });

我的 PUT 请求使用了与上面相同的 URL,这让我有一段时间感到困惑,因为我希望我传递的 id 会在 URL 中使用。

也许这对其他人有帮助:)

于 2015-08-03T04:58:58.400 回答