gpt4 book ai didi

javascript - 有没有办法将参数传递给模拟函数?

转载 作者:行者123 更新时间:2023-12-03 00:34:00 24 4
gpt4 key购买 nike

使用 jest 进行单元测试,我有以下行:

jest.mock('../../requestBuilder');

在我的文件夹中,我有一个

__mocks__

我的模拟 requestBuilder.js 所在的子文件夹。我的 Jest 单元测试正确调用了我的模拟 requestBuilder.js。问题是,我的 requestBuilder 正在模拟 ajax 返回,因此我希望能够确定是否应该传回成功或失败的服务器响应。理想情况下,我想将一个参数传递到我的模拟函数中以确定是否“ajaxSuccess:true/false”。我怎样才能做到这一点?谢谢

最佳答案

您不想将参数传递到模拟函数中,传递给模拟函数的参数应该由您正在测试的代码段控制。您想要做的是更改模拟函数执行之间的模拟行为。

假设您正在尝试测试这段代码:

// getStatus.js

const requestBuilder = require('./requestBuilder');

module.exports = () => {
try {
const req = requestBuilder('http://fake.com/status').build();
if (req.ajaxSuccess) {
return {status: 'success'};
} else {
return {status: 'failure'}
}
} catch (e) {
return {status: 'unknown'};
}
};

我们想要测试 getStatus 是否正确使用 requestBuilder,而不是 builder.build() 方法是否正常工作。验证 builder.build() 是单独单元测试的责任。因此,我们为 requestBuilder 创建一个模拟,如下所示:

// __mocks__/requestBuilder.js

module.exports = jest.fn();

这个模拟只是设置了模拟函数,但它没有实现行为。模拟的行为应该在测试中定义。这将使您在逐个测试的基础上找到对模拟行为的粒度控制,而不是尝试实现支持每个用例的模拟(例如控制模拟行为的一些特殊参数)。

让我们使用这个新的模拟来实现一些测试:

// getStatus.spec.js

jest.mock('./requestBuilder');

const requestBuilder = require('./requestBuilder');
const getStatus = require('./getStatus');

describe('get status', () => {

// Set up a mock builder before each test is run
let builder;
beforeEach(() => {
builder = {
addParam: jest.fn(),
build: jest.fn()
};
requestBuilder.mockReturnValue(builder);
});

// every code path for get status calls request builder with a hard coded URL,
// lets create an assertion for this method call that runs after each test execution.
afterEach(() => {
expect(requestBuilder).toHaveBeenCalledWith('http://fake.com/status');
});

it('when request builder creation throws error', () => {
// Override the mocking behavior to throw an error
requestBuilder.mockImplementation(() => {
throw new Error('create error')
});
expect(getStatus()).toEqual({status: 'unknown'});
expect(builder.build).not.toHaveBeenCalled();
});

it('when build throws an error', () => {
// Set the mocking behavior to throw an error
builder.build.mockImplementation(() => {
throw new Error('build error')
});
expect(getStatus()).toEqual({status: 'unknown'});
expect(builder.build).toHaveBeenCalled();
});

it('when request builder returns success', () => {
// Set the mocking behavior to return ajaxSuccess value
builder.build.mockReturnValue({ajaxSuccess: true});
expect(getStatus()).toEqual({status: 'success'});
expect(builder.build).toHaveBeenCalled();
});

it('when request builder returns failure', () => {
// Set the mocking behavior to return ajaxSuccess value
builder.build.mockReturnValue({ajaxSuccess: false});
expect(getStatus()).toEqual({status: 'failure'});
expect(builder.build).toHaveBeenCalled();
});
});

关于javascript - 有没有办法将参数传递给模拟函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53731607/

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