gpt4 book ai didi

javascript - 重构使用同一文件中的函数进行测试的函数的正确方法

转载 作者:行者123 更新时间:2023-11-28 20:48:11 24 4
gpt4 key购买 nike

在我们的应用程序中,我们需要根据当前用户是否通过身份验证来使用不同的端点。身份验证的状态存储在 Redux 状态中。这是我使用 redux 选择器的常见模式:

// selectors.js

import {selectIsAuthenticated} from 'Redux/customer/selectors'

export const selectEndpoint = state => selectIsAuthenticated(state) ? 'guest' : 'authenticated'

export const selectEndpointA = state => `/rest/${selectEndpoint(state)}/a`

export const selectEndpointB = state => `/rest/${selectEndpoint(state)}/b`

测试时,这变得很复杂,因为我无法模拟 selectEndpoint.. 因此 selectEndpointA 的测试变得依赖于 selectEndpoint 的实现, 这并不理想。

测试这样的东西或重构它以更容易测试的正确方法是什么?

我考虑过重构,以便将 selectEndpoint 作为参数(或柯里化(Currying))传递给 selectEndpointA,例如:

export const selectEndpointA = selectEndpoint => state => `/rest/${selectEndpoint(state)}/a`

但这似乎过于复杂,因为现在在我的代码中我需要在任何我想使用的地方添加导入 selectEndpointA

编辑:

这是我的单元测试示例:

import * as selectors from 'Redux/global/selectors'
import * as customerSelectors from 'Redux/customer/selectors'
const nonAuthenticatedEndpoint = 'guest'
/* ... */
describe('selectEndpoint', () => {
it('returns proper endpoint for non authenticated user', () => {
customerSelectors.selectIsAuthenticated = jest.fn(() => false)
const state = 'state'
const expected = nonAuthenticatedEndpoint
expect(selectors.selectEndpoint(state)).toEqual(expected)
expect(customerSelectors.selectIsAuthenticated).toHaveBeenCalledWith(
state
)
})
}

Redux/global/selectors 中还有 selectEndpointAselectEndpointB

编辑:

以及我希望进行的测试示例:

  describe('selectEndpointA', () => {
it('returns correct endpoint for non authenticated user', () => {
const state = {
/* some specific state */
}
expect(selectors.selectEndpointA(state)).toEqual('/rest/guest/a')
})
})

虽然目前这确实有效,但我想找到一种方法将其与 selectEndpoint 的实现分离,并使比较值不依赖于 selectEndpoint 的返回

最佳答案

你问的是函数模拟,特别是 jest.mockmockReturnValue .模拟导入并定义您的函数应返回的内容。

import * as selectors from 'Redux/global/selectors'
jest.mock('Redux/global/selectors')

selectors.selectEndpointA.mockReturnValue(() => 'whatever you want')

关于javascript - 重构使用同一文件中的函数进行测试的函数的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57794054/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com