如何使用jasmine测试模拟函数的回调?

如何使用jasmine测试模拟函数的回调?,jasmine,Jasmine,我正在使用的第三方服务的方法有一个回调作为第二个参数。在现实生活中,当从服务器收到响应时,会执行此回调 我想模拟第三方方法进行单元测试,并为回调提供不同的响应参数,以确保其逻辑正确执行。例如,检查当状态不是“成功”时承诺是否被拒绝,或者在成功时仅返回保存的记录而不是整个响应 我用茉莉花做测试 function save() { var deferred = $q.defer(); thirdPartyService.doSave(record, function callback(re

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

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

我用茉莉花做测试

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');
  });;

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

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