5

我在设置单元测试以确定使用正确参数调用函数时遇到问题。useAHook返回foo调用函数的函数bar。代码看起来像这样

//myModule.js
export const useAHook = (arg1, arg2) => {
  const foo = useCallback(() => {
    bar(arg1, arg2);
  }, [arg1, arg2]);

  return foo;
}

export const bar = (a, b) => {
   //does some stuff with a and b
}

我正在尝试使用renderHookand对这段代码进行单元测试jest.spyOn。我想确认调用函数foo会导致bar使用正确的参数被调用。我的单元测试看起来像这样

//myModule.spec.js

import * as myModule from './myModule.js'

it('should call foo with correct arguments', () => {
  const spy = jest.spyOn(myModule, 'bar');
  const { result } = renderHook(() => myModule.useAHook('blah', 1234));
  const useAHookFunc = result.current;

  useAHookFunc();

  // fails, spy is not called
  expect(spy).toBeCalledWith('blah', 1234);
});

结果是测试失败,说spy永远不会被调用。我在这里做错了什么还是错误地使用了任何一个工具?

4

1 回答 1

8

这一行:

import * as myModule from './myModule.js'

...将模块绑定myModule.js导入 into myModule

然后这一行:

const spy = jest.spyOn(myModule, 'bar');

...将模块导出包装在bar间谍中...

...但是间谍永远不会被调用,因为useAHook它没有调用模块导出bar它只是bar直接调用。


如果您修改useAHook为调用模块导出,bar则将调用间谍。

有几种方法可以做到这一点。

你可以bar进入它自己的模块...

...或者您可以导入模块绑定,myModule.js以便您可以调用模块导出bar

import { useCallback } from 'react';

import * as myModule from './myModule';  // <= import the module bindings

export const useAHook = (arg1, arg2) => {
  const foo = useCallback(() => {
    myModule.bar(arg1, arg2);  // <= call the module export for bar
  }, [arg1, arg2]);

  return foo;
}

export const bar = (a, b) => {
   //does some stuff with a and b
}
于 2019-06-06T04:41:02.740 回答