![](/img/trans.png)
[英]ReactJS/JestJS/Enzyme: How to test graphql() function used in compose()?
[英]ReactJS/Enzyme: How to test a submit function, which calls a graphQL mutation via prop
我正在嘗試為此功能編寫單元測試(酶/玩笑):
_onSubmit = (event) => {
event.preventDefault()
const { username, password } = this.state
this.props.createUserMutation({
variables: { username, password }
}).then(response => {
const token = response.data.createUser.token
if (token) {
this.setState({ token })
}
}).catch(error => {
console.warn(error)
})
}
但是我不知道如何處理this.props.createUserMutation()
進行正確的測試。
當然,我當前的嘗試會引發TypeError: _this.props.createUserMutation is not a function
錯誤
單元測試
it('_onSubmit() should submit form and reset state object', () => {
const wrapper = shallow(<CreateAccount />)
wrapper.setState({ username: 'Username', password: 'Password' })
wrapper.find(Form).simulate('submit', {
preventDefault: () => {}
})
const state = wrapper.instance().state
expect(state).toEqual({ token: 'test' })
})
更新了單元測試
it('_onSubmit() should submit data and get result dataset', () => {
const createUserMutation = () => {
return Promise.resolve({
data: {
createUser: { token: 'token' }
}
})
}
const wrapper = shallow(<CreateAccount createUserMutation={createUserMutation} />)
wrapper.find(Form).simulate('submit', {
preventDefault: () => {}
})
const state = wrapper.instance().state
expect(state).toEqual({ token: 'token' })
})
console.log(state)
沒有給我token
。
我假設createUserMutation
由compose
函數注入到props中。
因此,您可以做的是在測試中導入非默認組件,而不是“連接的”組件。
import {CreateAccount} from './CreateAcount';
然后,您可以在安裝組件時將createUserMutation
作為道具直接傳遞給組件。
it('_onSubmit() should submit form and reset state object', () => {
const createUserMutation = () => {
return Promise.resolve({
username: '',
password: ''
});
};
const wrapper = shallow(<CreateAccount createUserMutation={createUserMutation} />)
...
});
假設createUserMutation
似乎是一個返回諾言的函數,可以將其分配給Promise.resolve()
以便執行then
函數來更改狀態。 基本上,這就是您要測試的內容。
此外,由於在方法_onSubmit
狀態更改之前正在運行測試中的驗證,因此您無法測試狀態中的token
更改。 (您可以通過將console
語句放在兩個位置來檢查此情況,並查看哪個先執行)。
您需要做的是在_onSubmit
方法中返回promise。
_onSubmit = (event) => {
event.preventDefault()
const { username, password } = this.state
return this.props.createUserMutation({ // returning the promise
variables: { username, password }
}).then(response => {
const token = response.data.createUser.token
if (token) {
this.setState({ token })
}
}).catch(error => {
console.warn(error)
})
}
然后,在單元測試中,您需要通過直接從props
調用函數來模擬Submit事件,以便將驗證放入then
函數中。 這樣,您將在狀態更改后運行您的expect
語句。
it('_onSubmit() should submit data and get result dataset', () => {
const createUserMutation = () => {
return Promise.resolve({
data: {
createUser: { token: 'token' }
}
})
}
const wrapper = shallow(<CreateAccount createUserMutation={createUserMutation} />)
wrapper.find(Form).props().onSubmit({
preventDefault: () => {}
}).then(() =< {
const state = wrapper.instance().state
expect(state).toEqual({ token: 'token' })
})
})
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.