麻烦使用AngularJS $ httpBackend来响应BreezeJS executeQuery

时间:2013-09-06 19:53:45

标签: angularjs breeze httpbackend

有没有人能够使用$ httpBackend构建规范或e2e测试,同时将BreezeJS功能作为您的实体管理器?

这是BreezeJS代码:

function getClientsAll() {
    var query = breeze.EntityQuery.from('clients').using($clientJsonResultsAdapter);        
    return em.executeQuery(query);
}

以下是使用AngularJS $ httpBackend的Jasmine规范的测试代码:

it('should show all clients', function() {
    $httpBackend.expectGET(/clients/).respond([ 200, mockData.clients.GET]);
    backupModelService.getClientsAll()
        .then(function() {
            console.log("getClientsAll success");
        })
        .fail(function() {
            console.log("getClientsAll fail");
        })
    $httpBackend.flush();//error thrown here
});

但是我得到了茉莉花测试失败

Error: No pending request to flush !

这个breeze方法在浏览器中运行良好,但在测试期间不能运行。但是,如果我转换为使用angularJS $ http或$ resource,则此测试将通过。我想知道BreezeJS是否与规范和e2e测试的$ httpBackend不兼容。

感谢您的任何见解。

//编辑---因为史蒂夫的回应而试图调整AJAX

这也失败了。

    var success = jasmine.createSpy('success');
    var fail = jasmine.createSpy('fail');
    spyOn($, 'ajax').andCallFake(function (req) {
        var d = $.Deferred();
        d.resolve(mockData.clients.GET);
        return d.promise();
    });
    backupModelService.getClientsAll()
        .then(success)
        .fail(fail);

    expect(success).toHaveBeenCalled();

2 个答案:

答案 0 :(得分:1)

Breeze不使用Angular的$ http或$资源来发送XHR。它使用jQuery的AJAX实现。因此,使用em.executeQuery(query)执行的查询将不会通过$ httpBackend。

使用Breeze进行测试时,你应该监视/存根/模拟jQuery的$ .ajax,如this post中所述。

答案 1 :(得分:0)

这不完全正确。 Breeze在v.1.4.4中为$ http添加了一个ajax适配器 这是设置ajax适配器的方法

function configBreeze($q, $http) {
    // tell the adapter to use your app module's $http for ajax calls

    var ajax = breeze.config.initializeAdapterInstance('ajax', 'angular');
    ajax.setHttp($http);
}

在此之后,您将能够在测试中使用$ httpBackend

此处有更多信息 http://www.breezejs.com/documentation/customizing-ajax 和这里 Breeze using angular $http interceptor