Angularjs $httpBackend whenPUT()的行为是否与whenGET()不同?
我正在编写一个将使用API的Angular服务的开始部分,我从删除所有请求操作开始。这项服务实际上还没有发生任何事情;它基本上是Angularjs $httpBackend whenPUT()的行为是否与whenGET()不同?,angularjs,jasmine,ecmascript-6,angular-mock,Angularjs,Jasmine,Ecmascript 6,Angular Mock,我正在编写一个将使用API的Angular服务的开始部分,我从删除所有请求操作开始。这项服务实际上还没有发生任何事情;它基本上是$http的包装器。我在这方面的测试中遇到了一个有趣的问题:我模拟出了一个PUT请求,它似乎没有像我预期的那样工作,我想知道我的理解在哪里失败了 基本上,当我检查observation.get(1)时,请求被正确模拟,测试通过。但是如果我做了observation.update({'some\u key':'some\u value'}),我会得到以下错误: Chrom
$http
的包装器。我在这方面的测试中遇到了一个有趣的问题:我模拟出了一个PUT
请求,它似乎没有像我预期的那样工作,我想知道我的理解在哪里失败了
基本上,当我检查observation.get(1)
时,请求被正确模拟,测试通过。但是如果我做了observation.update({'some\u key':'some\u value'})
,我会得到以下错误:
Chrome 51.0.2704 (Mac OS X 10.11.5) Observation responds to #save FAILED
Error: No response defined !
我想我已经在beforeach()函数体中定义了一个响应,但是规范仍然失败。奇怪的是,每一个其他测试都使用完全相同的语法通过。我做错了什么
班级(ES6是的)
规格
此时,观察
没有id
在这一点上,
观察
没有id。哦,我的上帝。我是哑巴。非常感谢。哦,我的上帝。我是哑巴。非常感谢。
class Observation {
constructor($http, AppSettings) {
'ngInject';
Object.assign(this, {$http, AppSettings});
this.headers = {
'Authorization': 'Token token=myfancytoken'
};
this.endpoint = `${this.AppSettings.API_URL}/api/${this.AppSettings.API_VERSION}/observations`;
}
get(id) {
this.id = id;
let params = {
url: `${this.endpoint}/${this.id}.json`,
method: 'GET'
};
return this.request(params);
}
save(data) {
if (typeof this.id === 'undefined') {
throw {message: 'Cannot save object without an id'};
}
let params = {
url: `${this.endpoint}/${this.id}.json`,
method: 'PUT',
data: data
};
return this.request(params);
}
request(params) {
Object.assign(params, {headers: this.headers});
return this.$http(params)
.then((response) => { return response.data; })
.catch((response) => { return response.status; });
}
/*
* Other actions omitted for brevity
*/
}
export default Observation;
import Observation from './observation';
describe('Observation', () => {
let $httpBackend, AppSettings, observation, $http, obj, successResponse;
beforeEach(() => {
AppSettings = {
"API_URL": 'http://localhost:3000',
'API_VERSION': 'v1'
};
inject(($injector) => {
$httpBackend = $injector.get('$httpBackend');
$http = $injector.get('$http');
});
observation = new Observation($http, AppSettings);
successResponse = (response) => {
obj = response.data;
};
/* Mock the backend */
// GET #show
$httpBackend
.when('GET', `${observation.endpoint}/1.json`)
.respond(200, {data: {}});
// PUT #save
// FIXME: Not working for some reason and needs to be defined in the test itself?
$httpBackend
.when('PUT', `${observation.endpoint}/${observation.id}.json`)
.respond(200, {data: {'id': 1}});
});
afterEach(function() {
$httpBackend.verifyNoOutstandingExpectation();
$httpBackend.verifyNoOutstandingRequest();
});
it('responds to #get', () => {
observation
.get(1)
.then(successResponse);
$httpBackend.expect('GET', `${observation.endpoint}/1.json`)
$httpBackend.flush();
expect(obj).toEqual({});
});
/* Other test cases omitted for brevity */
it('responds to #save', () => {
observation.id = 1;
observation
.save({'first_name': 'Lisa'})
.then(successResponse);
// FIXME: Why doesn't this work?
$httpBackend
.expect('PUT', `${observation.endpoint}/${observation.id}.json`);
// .respond(200, {data: {'id': 1}});
$httpBackend.flush();
expect(obj.id).toBe(1);
});
it('throws an error if #save is called without an id on the object', () => {
expect(() => {observation.save()}).toThrowError(Error, 'Cannot save object without an id');
});
});
$httpBackend
.when('PUT', `${observation.endpoint}/${observation.id}.json`)