1

我正在测试一个 angularjs 控制器,也使用模拟,但它会引发错误“错误:Unsatisfied requests: POST /myurl

我的测试文件包含这样的 beforeEach 方法

httpBackend.whenPOST('/myurl')
     .respond( 200,obj1 );
     httpBackend.expectPOST('/myurl')


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

我的测试用例是:

it('scope.mymethod should work fine', function(){

        httpBackend.flush()


        // verify size of array before calling the method    
        expect(scope.myobjs.length).toEqual(2)
        // call the method
        scope.saveNewPage(myobj)
        // verify size of array after calling the method
        expect(scope.myobjs.length).toEqual(3)

    })

该方法saveNewPage如下所示:

function saveNewPage(p){
    console.log('Hello')
    $http.post('/myurl', {
                e:p.e, url:p.url, name:p.name
            }).then(function (response) {
                    otherMethod(new Page(response.data.page))
                }, handleError);
}

请注意,console.log('Hello')它永远不会被执行(在业力控制台中它永远不会被打印)。

编辑:与此同时,我正在研究有关 httpBackend 的文档,我试图改变 httpBackend.flush() 的位置。基本上,我正在执行第一个flush(),以初始化范围内的数据,然后我执行该方法,然后我为挂起的请求执行另一个flush()。具体来说,在这种情况下,测试用例如下所示:

it('scope.saveNewPage  should work fine', function(){
        var p=new Object(pages[0])

        httpBackend.flush()

        httpBackend.whenPOST('/myurl',{
            url:pages[0].url,
            existingPage:new Object(pages[0]),
            name:pages[0].name
        }).respond(200,{data:pages[0]})
        httpBackend.expectPOST('/myurl')

        scope.saveNewPage(p)

        httpBackend.flush()


        expect(scope.pages.length).toBe(3)


    })

但是现在它提出了Error: No response defined !,就像我没有为那个 url 指定模拟一样

4

2 回答 2

0

我是这样解决的:

  • 我在调用方法测试之前调用了whenPOST和expectPOST
  • 我把 httpBackend.flush() 放在调用方法之后进行测试,这样,调用它生成挂起请求的方法,并通过 httpBackend.flush() 它满足挂起的请求
  • 我调整了respond方法的参数。基本上它不需要将响应与响应的data键相关联
于 2013-10-19T19:22:53.500 回答
-1

假设 POST 应该来自saveNewPage,您将需要在您检查结果的行httpBackend.flush()之间调用。仅刷新您的代码已请求的响应。saveNewPageflush

it('scope.mymethod should work fine', function(){
    expect(scope.myobjs.length).toEqual(2)
    scope.saveNewPage(myobj)
    expect(scope.myobjs.length).toEqual(2)

    httpBackend.flush()
    expect(scope.myobjs.length).toEqual(3)
})
于 2013-10-18T21:11:45.307 回答