Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/476.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用jest框架模拟基类_Javascript_Unit Testing_Jestjs - Fatal编程技术网

Javascript 使用jest框架模拟基类

Javascript 使用jest框架模拟基类,javascript,unit-testing,jestjs,Javascript,Unit Testing,Jestjs,我有一个基类,如下所示 class BaseClass { ..... ..... async request(options) { ....... ....... } } 这是由另一个类似这样的类扩展的 const BaseClass = require('@myorg/base-class').BaseClass; class MyClass extends BaseClass { async method1() { ....

我有一个基类,如下所示

class BaseClass {
  .....
  .....
  async request(options) {
    .......
    .......
  }
}
这是由另一个类似这样的类扩展的

const BaseClass = require('@myorg/base-class').BaseClass;

class MyClass extends BaseClass {

      async method1() {
        .............
        request()
        .............
      }

      async method2() {
        .............
        request()
        .............
      }

}
describe('MyClass', () => {
  afterEach(() => {
    jest.clearAllMocks();
    jest.resetAllMocks();
  });
  let MockClass = class BaseClass {
    request() {
      return {
        statusCode: 200,
        body: JSON.stringify({
          first_response: 'first_response'
        })
      };
    }
  };
  const mock = jest.mock('@myorg/base-class', () => {
    return {
      BaseClass: MockClass
    };
  });
  it('#method1 - test method one', async () => {
    const myClass = require('../src').myClass;
    const res = await myClass.method1();
    expect(res).toEqual('first_response');
  });

  it('#method2 - test method 2', async () => {
    mock.clearAllMocks();
    mock.resetAllMocks();
    MockClass = class BaseClass {
      request() {
        return {
          statusCode: 200,
          body: JSON.stringify({
            random_response: 'random_response'
          })
        };
      }
    };
    const myClass = require('../src').myClass;
    const res = await myClass.method2();
    expect(JSON.parse(res.body)).toEqual({
      random_response: 'random_response'
    });
    expect(res.statusCode).toEqual(200);
  });
});
现在我使用jest测试MyClass及其2个方法,模拟基类,并尝试为其请求方法发送模拟响应。因为我需要同时测试method1和method2,所以我需要在第一个之后更改模拟返回。我就是这样做的

const BaseClass = require('@myorg/base-class').BaseClass;

class MyClass extends BaseClass {

      async method1() {
        .............
        request()
        .............
      }

      async method2() {
        .............
        request()
        .............
      }

}
describe('MyClass', () => {
  afterEach(() => {
    jest.clearAllMocks();
    jest.resetAllMocks();
  });
  let MockClass = class BaseClass {
    request() {
      return {
        statusCode: 200,
        body: JSON.stringify({
          first_response: 'first_response'
        })
      };
    }
  };
  const mock = jest.mock('@myorg/base-class', () => {
    return {
      BaseClass: MockClass
    };
  });
  it('#method1 - test method one', async () => {
    const myClass = require('../src').myClass;
    const res = await myClass.method1();
    expect(res).toEqual('first_response');
  });

  it('#method2 - test method 2', async () => {
    mock.clearAllMocks();
    mock.resetAllMocks();
    MockClass = class BaseClass {
      request() {
        return {
          statusCode: 200,
          body: JSON.stringify({
            random_response: 'random_response'
          })
        };
      }
    };
    const myClass = require('../src').myClass;
    const res = await myClass.method2();
    expect(JSON.parse(res.body)).toEqual({
      random_response: 'random_response'
    });
    expect(res.statusCode).toEqual(200);
  });
});

问题是,一旦模拟被初始化,我就不能像第二次测试那样重置和分配不同的值。我怎样才能做到这一点呢?

一年前我也遇到过类似的问题。我有两个测试调用相同的模拟方法,但我希望有两个不同的输出

Jest并没有提供任何体面的方式来修改一个创建后的模拟,我想他们并没有改变这一点。(无法链接任何来源,抱歉,这是一段时间前的消息)

我有机会与一些经验丰富、才华横溢的程序员讨论,解决办法是在两个不同的文件中进行测试,其中有两个模拟的实现

简单,如果你遇到这个问题几次相当干净,但不方便,如果你必须经常这样做

请让我知道,如果你有更好的解决办法或修复


祝您好运

一次查看
mockImplementation
,而不是调用
mockImplementation
两次。也许会有帮助。好luck@BenoitMessiaen我做了一个小小的编辑。当我尝试使用时,MockImplementation()对我无效。我得到了一个
TypeError:Class extends value undefined不是构造函数或null
error当单个方法调用模拟函数两次时,问题会变得复杂。