имитация стороннего метода + шутка - PullRequest
0 голосов
/ 05 августа 2020
• 1000 test.spe c. js
    let edgejs = require('apigee-edge-js');
    const ctrl = require('../../controller');
    describe("Test suite for abc", () => {
        test("should return ...", async() =>{        
            edgejs.edge = jest.fn().mockImplementationOnce(async () => 
            {return  {"connect":{"developers":{"get":[{}]}}}}
           );
         ctrl.get(req, res)    
    });

Но это не насмешка, это вызов фактического метода подключения библиотеки. Что я здесь делаю не так. Пожалуйста, поделитесь своими идеями. Заранее спасибо.

РАБОЧИЙ КОД

jest.mock('apigee-edge-js', () => {
    return { edge: { connect: jest.fn() } };
  });

    const edgejs = require('apigee-edge-js');
    test("should return ...", async () => {
        edgejs.edge.connect.mockImplementationOnce(() => Promise.resolve(
            {"developers":{"get":[{}]}}
          ));    
        edgejs.edge.connect()
        expect(edgejs.edge.connect).toBeCalled();
        
      })

КОД ОШИБКИ:

jest.mock('apigee-edge-js', () => {
    return { edge: { connect: jest.fn() } };
  });

const Ctrl = require('../../controllers/controller'); ----> Extra line
const edgejs = require('apigee-edge-js');

test("should return ...", async () => {
    edgejs.edge.connect.mockImplementationOnce(() => Promise.resolve(
        {"developers":{"get":[{}]}}
      ));
    const req = mockRequest();
     const res = mockResponse();
    await Ctrl.get(req, res)  ---> Extra line
    expect(edgejs.edge.connect).toBeCalled();       
    
  });

Ошибка получения: TypeError: edge js .edge.connect.mockImplementationOnce не является функцией

1 Ответ

0 голосов
/ 05 августа 2020

Мок ни на что не влияет, потому что controller разыменовывает edgejs.edge сразу после импорта, apigeeEdge = edgejs.edge. Это было бы иначе, если бы он использовал edgejs.edge.connect вместо apigeeEdge.connect.

Методы не следует имитировать как ... = jest.fn(), потому что это предотвращает их восстановление и может повлиять на другие тесты после этого; это то, для чего нужен jest.spyOn. Более того, edge - это объект, а не метод.

Jest обеспечивает функциональность имитации модуля. Сторонние библиотеки обычно нужно имитировать в модульных тестах.

Это должно быть:

jest.mock('apigee-edge-js', () => {
  return { edge: { connect: jest.fn() } };
});

const ctrl = require('../../controller');
const edgejs = require('apigee-edge-js');

test("should return ...", async () => {
  edgejs.edge.connect.mockImplementationOnce(() => Promise.resolve(
    {"developers":{"get":[{}]}}
  ));
  await ctrl.get(req, res)
  ...
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...