Jest messageParent 只能在 worker 内部使用

you*_*ted 26 javascript unit-testing node.js reactjs jestjs

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

当我做

$npm test

我故意破坏我的代码(咳咳,删除一行代码)我收到了这条消息

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)
Run Code Online (Sandbox Code Playgroud)

我相信这是一条毫无意义的错误消息,如果有一些有意义的东西 (=.

这是我的测试

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());
  });
});
Run Code Online (Sandbox Code Playgroud)

应该说

DriverSocketFlow 失败原因:

检查 DriverSocketFlow 生成器函数是否被正常调用和断开连接

谢谢!寻找!

.... 所以我想我想通了! 这是我的新测试

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
    );
  });
Run Code Online (Sandbox Code Playgroud)

但我认为这是 npm test 中的错误 不知道为什么会这样,但是如果您在 package.json 脚本标记中的 npm test 中停止监视并重新启动测试...它应该可以工作.....

"scripts": {
    "test": "react-scripts test --watchAll=false",
    
  },
Run Code Online (Sandbox Code Playgroud)

并且....!不知道这一步是否有帮助,但我在根目录中添加了 jest.config.js 并删除了它,然后突然它起作用了......“ <- 咳咳,它可能什么也没做,只是继续重新启动它¯ _(?)_/¯....它对我有用”

这是完整的代码

driver.saga.spec.js

Eri*_*ian 8

也许期望变量的类型和右侧的答案在您的情况下有所不同。

就我而言,发生错误是因为我尝试在数组中使用 toBe 断言,而不是在 array.length 中

错误示例:

expect(array).toBe(3)
Run Code Online (Sandbox Code Playgroud)

正确示例:

expect(array.length).toBe(3)
Run Code Online (Sandbox Code Playgroud)


Tom*_*Tom 1

当您认为此错误无关紧要时,我怀疑您过于仓促。

“messageParent”只能在worker内部使用

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

jest来源证实,当运行此代码的线程不是工作线程时,会引发此错误。


(全面披露:我以前从未编写过网络工作者,所以我从未测试过。)

在我看来,您正在通过将工作代码加载到某种非工作人员中来测试它。你的样本让我认为DriverSocketFlow对话是io为了获得一个套接字。我假设这个套接字是传递工作消息的套接字。据推测,您真正的工作人员代码用于messageParent回复传入的消息。

看起来 Jest 提供了一些用于运行 Web Worker 的技术。我的猜测是,这项技术实际上在网络工作者内部运行要测试的代码。我还猜测您正在尝试以另一种方式做到这一点:您不是真正生成工作人员,而是使用常规 Jest 模拟来创建您认为与测试相关的工作人员上下文的假版本。我猜测的原因之一是因为我认为这就是这样做的方式。

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

您可以:

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