Javascript Jest messageParent只能在工作进程内使用

Javascript Jest messageParent只能在工作进程内使用,javascript,node.js,reactjs,unit-testing,jestjs,Javascript,Node.js,Reactjs,Unit Testing,Jestjs,有没有办法获得正确的错误消息 当我这样做的时候 $npm测试 我故意破坏我的代码(删除一行代码) 我收到这个消息 src/redux/drivers/driver.saga.spec.js Test suite failed to run "messageParent" can only be used inside a worker at messageParent (node_modules/jest-worker/build/workers

有没有办法获得正确的错误消息

当我这样做的时候

$npm测试

我故意破坏我的代码(删除一行代码) 我收到这个消息

src/redux/drivers/driver.saga.spec.js
   Test suite failed to run

    "messageParent" can only be used inside a worker

      at messageParent (node_modules/jest-worker/build/workers/messageParent.js:46:11)
我相信这是一条毫无意义的错误信息,如果能有一些有意义的东西就好了

这是我的测试

describe("DriverSocketFlow failed REASON:\n", () => {
  let socket;
  beforeEach(() => {
    socket = new MockedSocket();
    io.mockReturnValue(socket);
  });
  afterEach(() => {
    jest.restoreAllMocks();
  });
  const mockGeneratorPayload = { payload: { name: "Royal Palms" } };
  const generator = DriverSocketFlow(mockGeneratorPayload);

  test("Checking if DriverSocketFlow was called with it's methods and disconnected gracefully", () => {
    expect(generator.next(socket).value).toEqual(
      call(connect, mockGeneratorPayload.payload.name)
    );
    expect(generator.next(socket).value).toEqual(
      call(socketbug, mockGeneratorPayload.payload.name)
    );
    //disconnect gracefully
    expect(generator.next(socket).value).toEqual(
      fork(Read_Emit_Or_Write_Emit, socket)
    );
    expect(generator.next().value).toEqual(
      take(DriversActionTypes.DRIVERS_SOCKET_OFF)
    );
    expect(generator.next(socket).value).toEqual(call(disconnect, socket));
    expect(generator.next(socket).value).toEqual(call(disconnect, socket));

    expect(generator.next().value).toEqual(cancel());
  });
});
应该说

DriverSocketFlow失败原因:

检查DriverSocketFlow generator功能是否正常调用和断开

谢谢你看

。。。。 所以我想我知道了! 这是我的新测验

test("1. Connected to the socket successfully", () => {
    expect(generator.next(socket).value).toEqual(
      call(Connect_To_Socket, mockGeneratorPayload.payload.name)
    );
    expect(generator.next(socket).value).toEqual(
      call(socketbug, mockGeneratorPayload.payload.name)
    );
  });
  test("2. Read_Emit_Or_Write_Emit generator function operations for socket.on and emit", () => {
    expect(generator.next(socket).value.payload.fn).toEqual(
      fork(Read_Emit_Or_Write_Emit, socket).payload.fn
    );
  });
但我认为这是npm测试中的错误 不知道为什么会这样做,但如果您在package.json脚本标记内的npm测试中停止监视并重新启动测试…它应该可以工作

"scripts": {
    "test": "react-scripts test --watchAll=false",
    
  },
还有…!不知道这一步是否有用,但我补充道
在根目录中添加jest.config.js并将其删除,然后它突然工作了……”我怀疑您在将此错误视为不相关时过于草率

“messageParent”只能在worker内部使用

该错误消息非常强烈地表明您的测试试图在非工作上下文中运行工作代码

确认当运行此代码的线程不是工作线程时引发此错误


(完全披露:我以前从未编写过web worker,所以我从未测试过它。)

在我看来,您正在通过将工作代码加载到某种非工作代码中来测试工作代码。您的示例使我认为
DriverSocketFlow
io
对话以获取套接字。我假设此套接字就是将传递工作消息的套接字。您真正的工作代码可能使用
messageParent
回复传入的消息

Jest似乎提供了一些运行web worker的技术。我猜这项技术实际上是在web worker中运行要测试的代码。我还猜测您正试图以另一种方式进行测试:不是真正生成worker,而是使用常规Jest模拟来创建您认为是r的worker上下文的假版本与你的测试相关。我猜其中一个原因是因为我假设你会这样做

如果所有这些都是正确的,那么Jest提供了两种测试工作代码的方法,您试图将这两种技术混合使用,但都失败了

您可以:

  • (A)使用Jest worker技术将您的生产辅助代码加载到一个真正的web辅助程序中(我假设它在一个单独的线程中运行——使用Jest的辅助程序技术的主要好处之一可能是Jest然后为您管理该线程的生命周期)。这将使此错误消失,但您也必须停止模拟套接字。如果我的推测是准确的,我希望Jest worker技术人员从其管理的工作线程向您提供一个真实的套接字
  • (B)停止使用Jest的worker技术,并在主测试线程中运行worker代码,然后该代码将依赖于您将创建和提供的一组模拟,包括“worker”使用的这个假套接字“将用于与测试线束通信。如果
    MockedSocket
    不这样做,您可能负责在测试发送给工作人员的消息上构造一个假的
    messageParent
    。”

也会出现此错误;不幸的是,使用--watchAll=false运行脚本并没有解决此问题。创建并删除jest.config.js也没有解决此问题,但我认为我们认为这是巧合。