반응형
Vue Test Utils / Jest - 구성 요소 방법 내에서 클래스 방법이 호출되었는지 테스트하는 방법
나는 나의 단위 시험에 흥미로운 문제가 있다.내 유닛 테스트는 부품 안의 버튼을 클릭하기 위해 작성된다.이 버튼은 클래스의 인스턴스를 포함하는 구성 요소 메서드를 호출함Service
(Axios에 대한 래퍼 클래스).이 구성 요소 방법이 하는 유일한 일은 호출이다.Service.requestPasswordReset()
내 유닛 테스트는 다음을 검증해야 한다.Service.requestPasswordReset
부름을 받았다.
나는 내가 서비스 클래스를 올바르게 조롱하고 있다는 것을 안다. 왜냐하면 이 클래스는 내 유닛 테스트에서 통과하기 때문이다.
await Service.requestPasswordReset()
expect(Service.requestPasswordReset).toHaveBeenCalled()
그리고 나는 클릭할 때 정확하게 메소드를 호출하고 있다는 것을 안다. 왜냐하면 이것은 나의 유닛 테스트에서 통과하기 때문이다.
await wrapper.find('button').trigger('click')
expect(mockMethods.resend).toHaveBeenCalled()
나는 단지 내 시험을 볼 수 없어서 그 시험을 볼 수 없어.Service
메소드가 호출된다.좋은 생각 있어?
구성 요소
<template lang="pug">
Layout
section
header( class="text-center py-4 pb-12")
h1( class="text-grey-boulder font-light mb-4") Recovery Email
p( class="text-orange-yellow") A recovery email has been sent to your email address
div( class="text-center")
div( class="mb-6")
button(
type="button"
@click.stop="resend()"
class="bg-orange-coral font-bold text-white py-3 px-8 rounded-full w-48"
) Resend Email
</template>
<script>
import Layout from '@/layouts/MyLayout'
import Service from '@/someDir/Service'
export default {
name: 'RecoveryEmailSent',
page: {
title: 'Recovery Email Sent',
},
components: {
Layout,
},
data() {
return {
errorMessage: null
}
},
computed: {
userEmail() {
const reg = this.$store.getters['registration']
return reg ? reg.email : null
},
},
methods: {
async resend() {
try {
await Service.requestPasswordReset({
email: this.userEmail,
})
} catch (error) {
this.errorMessage = error
}
},
},
}
</script>
서비스js
import client from '@/clientDir/BaseClient'
class Service {
constructor() {
this.client = client(baseUrl)
}
requestPasswordReset(request) {
return this.client.post('/account_management/request_password_reset', request)
}
}
export { Service }
export default new Service()
서비스.js in__mock__
export default {
requestPasswordReset: jest.fn(request => {
return new Promise((resolve, reject) =>
resolve({
data: {
statusCode: 'Success',
},
})
)
})
}
단위 테스트
jest.mock('@/someDir/Service')
import { shallowMount, mount, createLocalVue } from '@vue/test-utils'
import RecoveryEmailSent from './AccountManagement.RecoveryEmailSent'
import Service from '@/someDir/Service'
const localVue = createLocalVue()
// localVue.use(Service) // <-- Tried this, didn't work
describe('Recovery Email Sent', () => {
it('should resend recovery email', async () => {
const mockMethods = {
resend: jest.fn()
}
const email = 'testemail@test.com'
const wrapper = mount(RecoveryEmailSent, {
localVue,
computed: {
userEmail() {
return email
},
},
methods: mockMethods
})
// await Service.requestPasswordReset()
await wrapper.find('button').trigger('click')
expect(mockMethods.resend).toHaveBeenCalled()
expect(Service.requestPasswordReset).toHaveBeenCalled()
})
})
난 이해했다.보아하니, 제스트의.toHaveBeenCalled()
해당 방법이 매개 변수를 사용하여 호출된 경우 true가 반환되지 않음.반드시 사용해야 한다..toHaveBeenCalledWith()
그들의 문서에는 이런 주의사항이 없지만, 그런 것 같다.
여기 내 합격 시험 코드가 있다.
it('should resend email hash', async () => {
const email = 'testemail@test.com'
const wrapper = mount(AccountManagementForgottenPasswordSubmitted, {
localVue,
computed: {
userEmail() {
return email
},
},
})
await wrapper.find('button').trigger('click')
expect(Service.requestPasswordReset).toHaveBeenCalledWith({
email: email
})
})
주입 로더를 사용하여 서비스를 조롱할 수 있음
기본 아이디어:
const RecoveryEmailSentInjector = require('!!vue-loader?inject!./AccountManagement.RecoveryEmailSent')
import Service from '@/someDir/Service'
const mockedServices = {
'@/someDir/Service': Service
}
describe('Recovery Email Sent', () => {
it('should resend recovery email', async () => {
const RecoveryEmailSentWithMocks = RecoveryEmailSentInjector(mockedServices)
const wrapper = mount(RecoveryEmailSentWithMocks, {
...
})
await wrapper.find('button').trigger('click')
expect(mockMethods.resend).toHaveBeenCalled()
expect(mockedServices.requestPasswordReset).toHaveBeenCalled()
})
})
반응형
'IT이야기' 카테고리의 다른 글
React Hooks useEffects의 기능이 호출되기 전에 렌더가 발생하는가? (0) | 2022.03.25 |
---|---|
Python strftime - 선행 0이 없는 날짜? (0) | 2022.03.25 |
VueJS 조건부로 요소의 속성 추가 (0) | 2022.03.25 |
각도 6 zip이 더 이상 사용되지 않음: resultSelector가 더 이상 지원되지 않음, 파이프에서 맵으로 (0) | 2022.03.24 |
react-native init(0.57) '@babel/plugin-외부 도움말' 모듈을 찾을 수 없음 (0) | 2022.03.24 |