假设我有一个导出默认功能的简单文件:
String masterKeyUri = "aws-kms://arn:aws:kms:us-east-1:007084425826:key/84a65985-f868-4bfc-83c2-366618acf147";
KeysetHandle keysetHandle = KeysetHandle.read(
JsonKeysetReader.withFile(new File(keysetFilename)),
new AwsKmsClient().withDefaultCredentials().getAead(masterKeyUri))
我会这样使用:
// UniqueIdGenerator.js
const uniqueIdGenerator = () => Math.random().toString(36).substring(2, 8);
export default uniqueIdGenerator;
我想在测试中断言在保持原始功能的同时调用了此方法。我会用import uniqueIdGenerator from './UniqueIdGenerator';
// ...
uniqueIdGenerator();
来做,但是它需要一个对象以及一个函数名作为参数。如何以一种干净的方式做到这一点?有兴趣的人可以为jest.spyOn
使用类似的GitHub issue。
答案 0 :(得分:2)
仍然愿意接受建议,但我所做的却是放弃了默认导出:
// UniqueIdGenerator.js
export const uniqueIdGenerator = () => Math.random().toString(36).substring(2, 8);
然后我可以像这样使用和监视它:
import * as UniqueIdGenerator from './UniqueIdGenerator';
// ...
const spy = jest.spyOn(UniqueIdGenerator, 'uniqueIdGenerator');
Some recommend将它们包装在const对象中,然后导出。我想您也可以使用包装类。
但是,如果您不能修改类,那么仍然有一个(不太好的)解决方案:
import * as UniqueIdGenerator from './UniqueIdGenerator';
// ...
const spy = jest.spyOn(UniqueIdGenerator, 'default');
答案 1 :(得分:1)
在某些情况下,您必须模拟导入才能监视默认导出:
spring:
http:
multipart:
max-file-size: 10MB
max-request-size: 10MB
答案 2 :(得分:0)
也可以模拟导入并将原始实现作为模拟实现传递,例如:
import uniqueIdGenerator from './UniqueIdGenerator'; // this import is a mock already
jest.mock('./UniqueIdGenerator.js', () => {
const original = jest. requireActual('./UniqueIdGenerator')
return {
__esModule: true,
default: jest.fn(original.default)
}
})
test(() => {
expect(uniqueIdGenerator).toHaveBeenCalled()
})
答案 3 :(得分:-1)
对我有用的是来自 Janne Annala 的答案和 OP 自己的解决方案的组合。我想要测试的只是辅助方法是否使用正确的参数调用,因为我已经为辅助方法编写了测试,并且它对我后续的测试没有任何影响:
// myHelperMethod.js
export const myHelperMethod = (param1, param2) => { // do something with the params };
// someOtherFileUsingMyHelperMethod.js
import * as MyHelperMethod from '../myHelperMethod';
jest.mock('../myHelperMethod', () => ({
myHelperMethod: jest.fn(),
}));
let myHelperMethodSpy = jest.spyOn(MyHelperMethod, 'myHelperMethod');
// ...
// some setup
// ...
test(() => {
expect(myHelperMethodSpy).toHaveBeenCalledWith(param1, param2);
});