Jest createSpyObj

时间:2017-07-25 13:05:44

标签: jestjs

使用Chai,您可以按如下方式创建间谍对象:

chai.spy.object([ 'push', 'pop' ]);

使用jasmine,您可以使用:

jasmine.createSpyObj('tape', ['play', 'pause', 'stop', 'rewind']);

什么是Jest等价物?

上下文:我目前正在将(打字稿)Jasmine测试迁移到(typescript)Jest。在这种情况下,迁移指南基本上没用:https://facebook.github.io/jest/docs/migration-guide.html与任何相对较新的技术一样,在文档中没有任何内容可以轻易找到。

4 个答案:

答案 0 :(得分:6)

const video = {
  play() {
    return true;
  },
};

module.exports = video;

测试:

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

test('plays video', () => {
  const spy = jest.spyOn(video, 'play');
  const isPlaying = video.play();

  expect(spy).toHaveBeenCalled();
  expect(isPlaying).toBe(true);

  spy.mockReset();
  spy.mockRestore();
});

在此处找到文档:https://facebook.github.io/jest/docs/en/jest-object.html#jestspyonobject-methodname

还有jest.fn()

const mockFn = jest.fn();
  mockFn();
  expect(mockFn).toHaveBeenCalled();

  // With a mock implementation:
  const returnsTrue = jest.fn(() => true);
  console.log(returnsTrue()); // true;

https://facebook.github.io/jest/docs/en/jest-object.html#jestfnimplementation

答案 1 :(得分:6)

我为jest编写了一个非常快速的createSpyObj函数,以支持旧项目。基本上是从Jasmine的实现中移植过来的。

export const createSpyObj = (baseName, methodNames): { [key: string]: Mock<any> } => {
    let obj: any = {};

    for (let i = 0; i < methodNames.length; i++) {
        obj[methodNames[i]] = jest.fn();
    }

    return obj;
};

答案 2 :(得分:0)

David的答案有助于我走上正轨。我在Ionic3 / Angular4项目中修改它以使用离子模拟(https://github.com/stonelasley/ionic-mocks)。

在我的测试&#34;帮助&#34;上课,我有这个:

export function  createSpyObj (baseName: string, methodNames: string[]): { [key: string]: jasmine.Spy } {
  const obj: any = {}
  for (let i: number = 0; i < methodNames.length; i++) {
    obj[methodNames[i]] = jasmine.createSpy(baseName, () => {})
  }
  return obj
}

然后我可以在我的test / spec文件中使用它。我将问题提供者注入:

{ provide: AlertController, useFactory: () => AlertControllerMock.instance() },

直到离子模拟与Jest兼容,我必须复制我想要的模拟(使用createSpyObj):

class AlertMock {
  public static instance (): any {
    const instance: any = createSpyObj('Alert', ['present', 'dismiss'])
    instance.present.and.returnValue(Promise.resolve())
    instance.dismiss.and.returnValue(Promise.resolve())

    return instance
  }
}

class AlertControllerMock {
  public static instance (alertMock?: AlertMock): any {

    const instance: any = createSpyObj('AlertController', ['create'])
    instance.create.and.returnValue(alertMock || AlertMock.instance())

    return instance
  }
}

答案 3 :(得分:0)

基于@Max Millington 的回答,我找到了使用 jest.fn() 方法的解决方案:

  1. 创建模拟对象:

const tape: any = {};

  1. 为模拟对象添加所需的方法

tape['play'] = jest.fn();

  1. 您可以监视模拟方法,但首先将其分配给真实对象,例如我正在使用组件实例:

    // GIVEN
    comp.realTape = tape
    
    // WHEN
    spyOn( comp.realTape , 'play')
    comp.method()
    
    // THEN
    expect(comp.realTape.play).toHaveBeenCalledTimes(1)