Javascript 为什么$httpBackend不';t填充参数
我有一个$资源,用于处理实体的CRUDHTTP请求。它被包装在我的定制服务中,目前没有添加任何功能,所以没关系-它只是一个旧的普通$resource:Javascript 为什么$httpBackend不';t填充参数,javascript,angularjs,single-page-application,angularjs-e2e,httpbackend,Javascript,Angularjs,Single Page Application,Angularjs E2e,Httpbackend,我有一个$资源,用于处理实体的CRUDHTTP请求。它被包装在我的定制服务中,目前没有添加任何功能,所以没关系-它只是一个旧的普通$resource: app.factory('coursesService', ['$resource', coursesService]); function coursesService($resource) { return $resource('/api/courses/:id', { id: '@id' }, { update: {
app.factory('coursesService', ['$resource', coursesService]);
function coursesService($resource) {
return $resource('/api/courses/:id', {
id: '@id'
}, {
update: {
method: 'PUT'
}
});
}
因此,我试图删除控制器中的一个实例(存储在控制器对象的courseToDelete
属性中):
我正在使用ngMockE2E模块中的$httpBackend服务模拟后端:
$httpBackend.whenDELETE(/api\/courses\/(.+)/, undefined, undefined, ['id'])
.respond(function(method, url, data, headers, params) {
clientStorage.deleteCourse(params.id);
return [200, {}];
});
因此,当$resource发送DELETE-http请求时,我希望能够将其从本地存储中删除(因为我没有后端,数据以序列化JSON字符串的形式存储在本地存储中)
我正在尝试删除的对象:
{
id: 1,
name: 'Course 1',
duration: 380,
description: 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.' +
' Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.' +
' Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur' +
' sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.',
created: new Date(2011,10,30),
authors: [
'Пушкин', 'Лермонтов'
]
}
从中,我希望我的
params
参数将具有id
属性,但是当函数执行时,params
是未定义的,尽管所有其他参数看起来都很好。我做错了什么?来自angular$httpBackend docs
whenDELETE(url、[headers]、[keys])
但是当删除(url,未定义,未定义,[键])时,您正在使用
因此,您的keys
参数未定义,并且没有任何内容作为参数传递
更新:注意:1.4.8及更早版本未实现此功能courseToDelete对象的外观如何?它有Id属性吗?@Gustav,我将此信息添加到问题中我更喜欢$httpBackend.expectDELETE到$httpBackend.whenDELETE。。。使用expect,您可以在预期调用时在单元测试中使用$httpBackend.flush()。这将确保调用已发出,否则测试将失败。whenDELETE不会导致测试失败,如果调用从未进行过,那么您无法确定调用是否在单元测试中进行过。您是说我应该这样重写:$httpBackend.whenDELETE(/api\/courses\/(.+)/,undefined,['id'))
?是的,结果与此完全相同您使用的是什么版本?为1.5.0编写的文档。1.4.8及更早版本没有实现此功能。我想我别无选择,只能手动解析url并提取所需参数。好的,谢谢!如果根据您最后的评论编辑您的答案,我将接受。
{
id: 1,
name: 'Course 1',
duration: 380,
description: 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.' +
' Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.' +
' Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur' +
' sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.',
created: new Date(2011,10,30),
authors: [
'Пушкин', 'Лермонтов'
]
}