使用$ resource和$ httpBackend的AngularJS奇怪的行为

时间:2014-07-10 09:45:39

标签: angularjs jasmine angular-resource

我将以下AngularJS资源公开为服务

 myServices.factory('Service1', ['$resource',
    function ($resource) {

        var Registrations = $resource('/api/v1/registration/:id');

        return {
            getForTcn: function(tcn) {
                return Registrations.query({ tcn: tcn, state: 'Active' }).$promise;
            }

        };
    } ]);

我的Jasmine测试在下面失败

beforeEach(inject(function (_$httpBackend_, Service1) {
    $httpBackend = _$httpBackend_;
    service = Service1;

    $httpBackend.when('GET', /^\/api\/v1\/registration\?.*/).respond([]);
}));afterEach(function () {
    $httpBackend.verifyNoOutstandingExpectation();
    $httpBackend.verifyNoOutstandingRequest();
});

通过以上设置,断言失败

it('should have correct http GET request', function () {
    Service.getForTcn('1234');
    $httpBackend.expectGET('/api/v1/registration?tcn=1234&State=Active');
    $httpBackend.flush();
});

如果我在服务函数和断言中交换参数的位置,则测试通过。

getForTcn: function(tcn) {
                return Registrations.query({ state: 'Active', tcn: tcn }).$promise;
            }
$httpBackend.expectGET('/api/v1/registration?state=Active&tcn=1234');

知道这里发生了什么吗? 如果在测试之外执行时失败的版本实际上有效,但有人看到类似的行为,我还没试过? 感谢

1 个答案:

答案 0 :(得分:3)

问题是查询参数是按字母顺序排列的,所以如果你有foo作为参数,那么你的断言将是:

$httpBackend.expectGET('/api/v1/registration?foo=1234&state=Active');

这将通过。相反,如果参数是zoo,那么断言将是:

$httpBackend.expectGET('/api/v1/registration?state=Active&zoo=1234');

这就是为什么你必须在问题中指出tcn参数之后放置state