用Jest模拟导出的const箭头功能

时间:2020-02-18 15:56:07

标签: javascript jestjs

鉴于以下示例具有基本测试,我希望在用Jest模拟bar时返回sendMessage.message。而是在调用时返回“ Hello World”的原始值。

serviceBus.js

export const message = () => {
  return "Hello world";
};

export const foo = () => {
  return message();
};

mockDemo.test.js

import * as sendMessage from "../src/services/serviceBus";

describe("sendMessage", () => {
  sendMessage.message = jest.fn(() => {
    return "bar";
  });

  it(`message should return bar`, async () => {
    expect(sendMessage.message()).toBe("bar");
    expect(sendMessage.foo()).toBe("bar");
  });
});

结果如下:

$ ./node_modules/.bin/jest ./__tests__/mockDemo.test.js
 FAIL  __tests__/mockDemo.test.js
  MessageReceiver Router
    ✕ message should return bar (9ms)

  ● MessageReceiver Router › message should return bar

    expect(received).toBe(expected) // Object.is equality

    Expected: "bar"
    Received: "Hello world"

       9 |   it(`message should return bar`, async () => {
      10 |     expect(sendMessage.message()).toBe("bar");
    > 11 |     expect(sendMessage.foo()).toBe("bar");
         |                               ^
      12 |   });
      13 | });
      14 |

      at Object.<anonymous> (__tests__/mockDemo.test.js:11:31)

Test Suites: 1 failed, 1 total
Tests:       1 failed, 1 total

sendMessage.foo导入后,似乎message正在调用绑定函数,默认情况下返回Hello World

在这种情况下如何模拟message

更新

使用jest.fn().mockImplementation(() => "bar");会产生相同的行为:

describe("MessageReceiver Router", () => {
  //   sendMessage.message.mockImplementation = jest.fn(() => {
  //     return "bar";
  //   });

  sendMessage.message = jest.fn().mockImplementation(() => "bar");

  it(`message should return bar`, async () => {
    expect(sendMessage.message()).toBe("bar");
    expect(sendMessage.foo()).toBe("bar");
  });
});

结果:

$ ./node_modules/.bin/jest ./__tests__/mockDemo.test.js
 FAIL  __tests__/mockDemo.test.js
  MessageReceiver Router
    ✕ message should return bar (10ms)

  ● MessageReceiver Router › message should return bar

    expect(received).toBe(expected) // Object.is equality

    Expected: "bar"
    Received: "Hello world"

      11 |   it(`message should return bar`, async () => {
      12 |     expect(sendMessage.message()).toBe("bar");
    > 13 |     expect(sendMessage.foo()).toBe("bar");
         |                               ^
      14 |   });
      15 | });
      16 |

      at Object.<anonymous> (__tests__/mockDemo.test.js:13:31)

Test Suites: 1 failed, 1 total
Tests:       1 failed, 1 total
Snapshots:   0 total
Time:        2.175s

2 个答案:

答案 0 :(得分:1)

因此无法模拟或监视称为 的内部函数。要解决此问题,您需要创建服务的对象,然后将其导出。

serviceBus.js

const message = () => {
  return "Hello world";
};

const foo = () => {
  return services.message();
};

const services = {
  message,
  foo
};

export default services;

mockDemo.test.js

import sendMessage from "../src/services/serviceBus";

describe("MessageReceiver Router", () => {
  sendMessage.message = jest.fn(() => {
    return "bar";
  });

  it(`message should return bar`, async () => {
    expect(sendMessage.message()).toBe("bar");
    expect(sendMessage.foo()).toBe("bar");
  });
});

答案 1 :(得分:0)

您应该使用spyOn方法来模拟sendMessage.message方法。

import * as sendMessage from "../src/services/serviceBus";

describe("sendMessage", () => {
   jest.spyOn(sendMessage, 'message').mockReturnValue("bar")

  it(`message should return bar`, async () => {
    expect(sendMessage.message()).toBe("bar");
    expect(sendMessage.foo()).toBe("bar");
  });
});