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
});
});
這是測試這種服務的正確方法嗎?我該如何測試回調的工作原理?
非常感謝,這有效:)你知道如何不存根響應,但得到實際的響應? 我知道stripe.js有很多不同的包裝和模塊,但他們都做不同的事情,有些沒有測試,所以我做了我自己的方法。 – 2014-11-24 19:17:29
假設回調意味着一些異步處理從lib中調用http調用,所以你需要掛鉤它來模擬你需要的部分。響應對象似乎已經足夠記錄,儘管可能保留,所以我會依靠它。否則,實際響應可能意味着實際的呼叫,所以與實際服務的集成測試可能會派上用場。但我傾向於寫這些庫的外觀或某種包裝來測試我的代碼行爲,而不是第三方的單元測試。 – 2014-11-25 12:26:59