【发布时间】:2021-08-06 11:32:29
【问题描述】:
我在从测试中剔除 Stripe 时遇到了一些麻烦
CartCheckoutButton.ts
import React from 'react'
import { loadStripe } from '@stripe/stripe-js'
import useCart from '~/state/CartContext'
import styles from './CartCheckoutButton.module.scss'
const stripePromise = loadStripe(process.env.NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY)
const CartCheckoutButton = ({}: TCartCheckoutButtonProps) => {
const { cartItems } = useCart()
const handleCheckOutOnClick = async (event) => {
const { sessionId } = await fetch('/api/checkout/session', {
method: 'POST',
headers: {
'content-type': 'application/json',
},
body: JSON.stringify({ cartItems }),
}).then((res) => res.json())
const stripe = await stripePromise
const { error } = await stripe.redirectToCheckout({
sessionId,
})
if (error) {
// TODO: Show some error message
console.log(error)
}
}
return (
<div className={styles.container}>
<button onClick={handleCheckOutOnClick} disabled={cartItems.length == 0}>
CHECKOUT
</button>
</div>
)
}
export default CartCheckoutButton
EndUserExperience.spec.js
import * as stripeJS from '@stripe/stripe-js'
describe('End user experience', () => {
beforeEach(() => {
cy.visit('http://localhost:3000/')
cy.stub(stripeJS, 'loadStripe').resolves(
new Promise(function (resolve, reject) {
resolve({
redirectToCheckout({ sessionId }) {
console.log(`redirectToCheckout called with sessionId: ${sessionId}`)
return new Promise(function (resolve, reject) {
resolve({ error: true })
})
},
})
})
)
})
it('Orders some dishes and makes a checkout', () => {
console.log('working on it')
})
})
当我点击它时,它仍然会重定向我。所以存根似乎没有启动..
更新二
尝试@RichardMatsen 建议的以下解决方案
import React from 'react'
import * as stripeModule from '@stripe/stripe-js'
import useCart from '~/state/CartContext'
import styles from './CartCheckoutButton.module.scss'
const stripePublishableKey = process.env.NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY
const CartCheckoutButton = ({}: TCartCheckoutButtonProps) => {
const { cartItems } = useCart()
// https://stackoverflow.com/questions/67565714/cypress-stub-out-loadstripe
const stripePromise = React.useCallback(() => {
window['stripeModule'] = stripeModule
return stripeModule.loadStripe(stripePublishableKey)
}, [stripeModule, stripePublishableKey])
const handleCheckOutOnClick = async (event) => {
const { sessionId } = await fetch('/api/checkout/session', {
method: 'POST',
headers: {
'content-type': 'application/json',
},
body: JSON.stringify({ cartItems }),
}).then((res) => res.json())
const stripe = await stripePromise()
const { error } = await stripe.redirectToCheckout({
sessionId,
})
if (error) {
// TODO: Show some error message
console.log(error)
throw error
}
}
return (
<div className={styles.container}>
<button onClick={handleCheckOutOnClick} disabled={cartItems.length == 0}>
TILL KASSAN
</button>
</div>
)
}
export default CartCheckoutButton
test.spec.js
describe('End user experience', async () => {
beforeEach(() => {
cy.visit('http://localhost:3000/')
cy.window().then((win) => {
console.log(win)
cy.stub(win.stripeModule, 'loadStripe').resolves(
new Promise(function (resolve, reject) {
resolve({
redirectToCheckout({ sessionId }) {
console.log(`redirectToCheckout called with sessionId: ${sessionId}`)
return new Promise(function (resolve, reject) {
resolve({ error: true })
})
},
})
})
)
})
cy.intercept('GET', /.*stripe.*/, (req) => {
req.redirect('http://localhost:3000/checkout/success')
})
})
it('Orders some dishes and makes a checkout', () => {
console.log('working on it')
})
})
但它仍然重定向我并显示错误
Trying to stub property 'loadStripe' of undefined
【问题讨论】:
-
重新更新:你不能等待
cy.window(),它有一个.then()方法但它不是一个promise。 -
useEffect不需要设置 stripeModule 引用,但它应该用于推迟对stripeModule.loadStripe的调用 - 见下文 -
“尝试存根属性 'loadStripe' of undefined”是因为您设置
window.stripeModule太晚了。应该在导入后立即完成。
标签: javascript typescript stripe-payments cypress