Angularjs $httpBackend whenPUT()的行为是否与whenGET()不同?

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

我正在编写一个将使用API的Angular服务的开始部分,我从删除所有请求操作开始。这项服务实际上还没有发生任何事情;它基本上是
$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`)