繁体   English   中英

如何在 Node.js/Jest 中模拟嵌套模块响应

[英]how to mock nested module response in Node.js/Jest

我想在从另一个组件调用的组件的方法中抛出和错误,而不是我正在测试

// Class1.js
class Class1 {
  getData() {
    return { data }
  }
}
module.exports = new Class1()

// Class2.js
class1 = require('./Class1')
class Class2 {
  getData() {
    try {
      let data = class1.getData()
      return { data }
    } catch (err) {
      return err
    }
  }
}
module.exports = new Class2()

// Class2.spec.js
const class1 = require('./Class1')
const class2 = require('./Class2')

test("Test Class2 catch block", () => {
  jest.spyOn(class1, 'getData').mockReturnValue(new Error("Error"))
  expect(class2.getData()).toEqual(Error("Error"));
})

但是 jest.spyOn 没有捕获并抛出一个新的错误。我做错了什么? 我需要在 Class2 中测试 catch 块

单元测试解决方案:

class1.js

class Class1 {
  getData() {
    return { data };
  }
}
module.exports = new Class1();

class2.js

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

class Class2 {
  getData() {
    try {
      let data = class1.getData();
      return { data };
    } catch (err) {
      return err;
    }
  }
}
module.exports = new Class2();

class2.test.js

const class1 = require('./class1');
const class2 = require('./class2');

describe('65258975', () => {
  afterEach(() => {
    jest.restoreAllMocks();
  });
  test('Test Class2 catch block', () => {
    const getDataSpy = jest.spyOn(class1, 'getData').mockImplementationOnce(() => {
      throw new Error('Error');
    });
    const actual = class2.getData();
    expect(actual).toBeInstanceOf(Error);
    expect(actual.message).toEqual('Error');
    expect(getDataSpy).toBeCalledTimes(1);
  });

  test('should pass', () => {
    const getDataSpy = jest.spyOn(class1, 'getData').mockReturnValueOnce('teresa teng');
    const actual = class2.getData();
    expect(actual).toEqual({ data: 'teresa teng' });
    expect(getDataSpy).toBeCalledTimes(1);
  });
});

单元测试结果:

 PASS  examples/65258975/class2.test.js
  65258975
    ✓ Test Class2 catch block (3 ms)
    ✓ should pass

-----------|---------|----------|---------|---------|-------------------
File       | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
-----------|---------|----------|---------|---------|-------------------
All files  |    87.5 |      100 |      50 |    87.5 |                   
 class1.js |      50 |      100 |       0 |      50 | 3                 
 class2.js |     100 |      100 |     100 |     100 |                   
-----------|---------|----------|---------|---------|-------------------
Test Suites: 1 passed, 1 total
Tests:       2 passed, 2 total
Snapshots:   0 total
Time:        5.976 s

源代码: https://github.com/mrdulin/jest-v26-codelab/tree/main/examples/65258975

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM