我可以使用 Jest 模拟带有特定参数的函数吗? [英] Can I mock functions with specific arguments using Jest?
问题描述
我想用 Jest 模拟一个函数,但前提是它是用特定参数调用的,例如:
I want to mock a function with Jest, but only if it is called with specific arguments, for example:
function sum(x, y) {
return x + y;
}
// mock sum(1, 1) to return 4
sum(1, 1) // returns 4 (mocked)
sum(1, 2) // returns 3 (not mocked)
Ruby 的 RSpec 库中实现了类似的功能:
There is a similar feature implemented in Ruby's RSpec library:
class Math
def self.sum(x, y)
return x + y
end
end
allow(Math).to receive(:sum).with(1, 1).and_return(4)
Math.sum(1, 1) # returns 4 (mocked)
Math.sum(1, 2) # returns 3 (not mocked)
我在测试中试图实现的是更好的解耦,假设我想测试一个依赖于 sum
的函数:
What I'm trying to achieve in my tests is a better decoupling, let's say I want to test a function that relies on sum
:
function sum2(x) {
return sum(x, 2);
}
// I don't want to depend on the sum implementation in my tests,
// so I would like to mock sum(1, 2) to be "anything I want",
// and so be able to test:
expect(sum2(1)).toBe("anything I want");
// If this test passes, I've the guarantee that sum2(x) is returning
// sum(x, 2), but I don't have to know what sum(x, 2) should return
我知道有一种方法可以通过执行以下操作来实现:
I know that there is a way to implement this by doing something like:
sum = jest.fn(function (x, y) {
if (x === 1 && y === 2) {
return "anything I want";
} else {
return sum(x, y);
}
});
expect(sum2(1)).toBe("anything I want");
但是如果我们有一些糖函数来简化它会很好.
But it would be nice if we had some sugar function to simplify it.
这听起来合理吗?我们是否已经在 Jest 中提供了此功能?
Does it sounds reasonable? Do we already have this feature in Jest?
感谢您的反馈.
推荐答案
我发现了我同事最近写的这个库:jest-when
I found this library that a colleague of mine wrote recently: jest-when
import { when } from 'jest-when';
const fn = jest.fn();
when(fn).calledWith(1).mockReturnValue('yay!');
const result = fn(1);
expect(result).toEqual('yay!');
这是图书馆:https://github.com/timkindberg/jest-when
这篇关于我可以使用 Jest 模拟带有特定参数的函数吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!