我正在测试一个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 !
,就像我没有为该网址指定模拟一样
答案 0 :(得分:0)
我这样解决了:
respond
方法的参数。基本上,它不需要将响应关联到响应的data
键答案 1 :(得分:-1)
假设POST应来自saveNewPage
,您需要在httpBackend.flush()
和检查结果的行之间调用saveNewPage
。 flush
仅刷新代码已请求的响应。
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)
})