如何使用茉莉花测试模拟函数的回调?

时间:2019-11-25 17:18:46

标签: jasmine

我正在使用的第三方服务方法将回调作为第二个参数。当从服务器收到响应时,将在现实生活中执行此回调。

我想模拟用于单元测试的第三方方法,并向回调提供不同的响应参数,以确保其逻辑正确执行。例如,当状态不是“成功”时检查承诺是否被拒绝,或者成功后仅返回保存的记录而不是整个响应。

我正在使用茉莉进行测试。

function save() {
  var deferred = $q.defer();

  thirdPartyService.doSave(record, function callback(response) {
    // How to test the code in here when doSave is mocked?
    if(response.status === 'success') {
      deferred.resolve(response.savedRecord);
    } else {
      deferred.reject(response);
    }
  });

  return deferred.promise;
}

我要运行的测试示例:

// Setup
const successResponse = {
  status: 'success',
  savedRecord: { Id: 'test-id' }
};
// Somehow config the mocked thirdParty.doSave() to use successResponse for the callback.

// Test
myService.save()
  .then(function(response) {
    expect(response.Id).toBe('test-id');
  });;

1 个答案:

答案 0 :(得分:0)

您可以使用thirdParty.doSave模拟spyOn.and.callFake

const successResponse = {
  status: 'success',
  savedRecord: { Id: 'test-id' }
};
spyOn(thirdParty, 'doSave').and.callFake((record, callback) => callback(successResponse));