angularjs控制器的测试:不满意的要求

时间:2013-10-18 20:34:52

标签: unit-testing angularjs testing mocking jasmine

我正在测试一个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')永远不会被执行(在karma控制台中,它永远不会被打印)。

编辑: 同时我正在研究关于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 !,就像我没有为该网址指定模拟一样

2 个答案:

答案 0 :(得分:0)

我这样解决了:

  • 在调用方法测试
  • 之前,我调用了whenPOST和expectPOST
  • 我在调用要测试的方法之后放了httpBackend.flush(),这样,调用它生成挂起请求的方法,并通过httpBackend.flush()来满足挂起的请求
  • 我调整了respond方法的参数。基本上,它不需要将响应关联到响应的data

答案 1 :(得分:-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)
})