2014-11-24 43 views
0

我使用條紋來獲取用戶的信用卡信息,條紋具有這樣的功能,這將使一個JSONP請求生成令牌(https://stripe.com/docs/stripe.js噶單元測試中JSONP回調遞延承諾(stripe.js)

我包裝這個呼叫的服務裏面:

app.factory('payment', ['$window', '$q', function($window, $q) { 

    return { 
    /** 
    * Creates stripe token. This token will be send to our server. 
    * @see https://stripe.com/docs/tutorials/forms 
    * @param {Object} formData 
    * @param {Element} form 
    * @return {Promise} 
    */ 
    createStripeToken: function(formData, form) { 
     if (angular.isUndefined($window.Stripe)) { return; } 

     var deferred = $q.defer(); 

     Stripe.card.createToken(formData, function(status, response) { 
     console.log(status) // => no output in test 
     var error = response.error; 

     if(error) { 
      // use form to set validations 
      if(error.type === 'card_error') { 
      var formField = error.param; // 'cvc' 
      form[formField].$setValidity(error.code, false); 
      } 
      deferred.reject(); 
     } else { 
      // response contains id (token) and card, which contains additional card details 
      deferred.resolve(response); 
     } 
     }); 
     return deferred.promise; 
    } 
    }; 

}]); 

一切工作正常,除了測試,這裏我使用的條紋與我們的測試API密鑰!

describe('Payment Service', function() { 
    var service; 
    var success, error; 

    beforeEach(inject(function (payment) { 
    service = payment; 
    })); 

    it('should get successful stripe response', function() { 
    var createTokenFn = spyOn(Stripe.card, 'createToken'); 
    // Stripe.card.createToken = jasmine.createSpy("createToken"); 

    var formData = { 
     number: '4111 1111 1111 1111', 
     cvc: '123', 
     exp_month: '12', 
     exp_year: '23' 
    }; 

    service.createStripeToken(formData, null).then(function(data) { 
     console.log('success') // => no output 
     success = data; 
    }, function(data) { 
     console.log('error') // => no output 
     error = data; 
    }); 

    $rootScope.$digest(); // $rootScope is loaded in my spec helper, this line makes no difference 

    expect(createTokenFn).toHaveBeenCalledWith(formData, jasmine.any(Function)); // success 
    expect(success).not.toEqual(undefined); // fail 
    }); 

}); 

這是測試這種服務的正確方法嗎?我該如何測試回調的工作原理?

回答

2

你可以通過使用由間諜提供的callFake獲得回覆。

var createTokenFn = spyOn(Stripe.card, 'createToken').andCallFake(function(formData, callback) { 
    callback(200, { error: undefined }); 
}); 

然後,您可以修改答案以適合您的不同用例。

小提琴:http://jsfiddle.net/bbbuu37w/1/

不知道,如果它是你的任何使用,但我跨lib這似乎是一個包裝Strip.Js的角度來了。

+0

非常感謝,這有效:)你知道如何不存根響應,但得到實際的響應? 我知道stripe.js有很多不同的包裝和模塊,但他們都做不同的事情,有些沒有測試,所以我做了我自己的方法。 – 2014-11-24 19:17:29

+1

假設回調意味着一些異步處理從lib中調用http調用,所以你需要掛鉤它來模擬你需要的部分。響應對象似乎已經足夠記錄,儘管可能保留,所以我會依靠它。否則,實際響應可能意味着實際的呼叫,所以與實際服務的集成測試可能會派上用場。但我傾向於寫這些庫的外觀或某種包裝來測試我的代碼行爲,而不是第三方的單元測試。 – 2014-11-25 12:26:59