开玩笑:如何模拟监听事件的依赖项?

Vij*_*wad 5 javascript node.js ecmascript-6 es6-promise jestjs

我遇到了一个非常复杂的情况。我会尽量保持简洁。

所以我在myModule.js 中有这样的代码:

const lib = require('@third-party/lib');

const myFunction = () => {
  const client = lib.createClient('foo');
  return new Promise((resolve, reject) => {
    client.on('error', (err) => reject(err));
    client.on('success', () => {
      client.as(param1).post(param2, param3, (err, data) => {
        if (err) reject(err);

        // Some important logical processing of data
        resolve(data);
      });
    });
  });
}

module.exports = { myFunction };
Run Code Online (Sandbox Code Playgroud)

有几件事情我可以嘲笑,如:createClient。我无法嘲笑的是我什至不知道如何做到这一点的事件部分还有那.as().post()部分。

这是我的笑话测试的样子:

const myModule = require('./myModule');
const mockData = require('./mockData');

describe('myFunction', () => {

  it('Should resolve promise when lib calls success event', async () => {
    try {
      const myData = await myModule.myFunction();
      expect(myData).toMatchObject(mockData.resolvedData);
    } catch (err) {
      expect(err).toBeNull();
    }
  })
});
Run Code Online (Sandbox Code Playgroud)

任何帮助,非常感谢。

我试图找到类似的问题,但在这一点上,我的思想刚刚停止工作......如果您需要更多详细信息,请告诉我。

dar*_*der 4

这里\xe2\x80\x99是你需要做的:

\n\n
// EventEmitter is here to rescue you\nconst events = require("events");\n\n// Mock the third party library\nconst lib = require("@third-party/lib");\n\nlib.createClient.mockImplementationOnce(params => {\n  const self = new events.EventEmitter();\n\n  self.as = jest.fn().mockImplementation(() => {\n    // Since we\'re calling post on the same object.\n    return self;\n  });\n\n  self.post = jest.fn().mockImplementation((arg1, _cb) => {\n    // Can have a conditional check for arg 1 if so desird\n    _cb(null, { data : "foo" });\n  });\n\n  // Finally call the required event with delay.\n  // Don\'t know if the delay is necessary or not.\n  setInterval(() => {\n    self.emit("success");\n  }, 10);\n  return self;\n}).mockImplementationOnce(params => {\n  const self = new events.EventEmitter();\n\n  // Can also simulate event based error like so:\n  setInterval(() => {\n    self.emit("error", {message: "something went wrong."});\n  }, 10);\n  return self;\n}).mockImplementationOnce(params => {\n  const self = new events.EventEmitter();\n  self.as = jest.fn().mockImplementation(() => {\n    return self;\n  });\n\n  self.post = jest.fn().mockImplementation((arg1, _cb) => {\n    // for negative callback in post I did:\n    _cb({mesage: "Something went wrong"}, null);\n  });\n\n  setInterval(() => {\n    self.emit("success");\n  }, 10);\n  return self;\n});\n
Run Code Online (Sandbox Code Playgroud)\n\n

这只是您需要放入test.js文件中的模拟对象。

\n\n

不确定此代码是否能按原样工作,尽管 won\xe2\x80\x99t 需要大量调试。

\n\n

如果您只想积极的情况,请删除第二个mockImplementationOnce并将第一个替换mockImplementationOncemockImplementation

\n

  • 我必须按照我的逻辑做出一些改变。尽管答案对我来说非常有效。 (2认同)