【问题标题】:t.context scoping in avaava中的t.context范围
【发布时间】:2020-10-21 14:10:15
【问题描述】:

我 90% 确定导致问题的原因,但我想澄清一下 ava 如何处理 t.context。这是我的场景:

const lMockManager = ImportMock.mockClass<zmq.Dealer>(zmq, "Dealer");
lMockManager.mock(Symbol.asyncIterator, lNewIterator);

test.before((t: ExecutionContext<TTestContext) =>
{
    t.context =
    {
        DummyData: [],
        PromiseCallback: null,
        ZMQMock: lMockManager,
    };

    const lNewIterator = (() =>
    {
        return {
            async next()
            {
                return new Promise((resolve: (aValue: string[]) => void): void =>
                {
                    t.context.PromiseCallback = resolve;
                });
            },
        };
    })();

});

test("Receive Message", (t: ExecutionContext<TTestContext) =>
{
    const lMessageReceiver = new MessageReceiver();  // Imports ZMQ as a dep
    lMessageReceiver.Start();  // This triggers the creation of t.PromiseCallback

    t.context.PromiseCallback("hello world"); // Error: t.context.PromiseCallback is null
});

出于测试目的,我将test.before()t.context 推送到一个全局对象中,并将其与test()t.context 进行比较,并确认这些对象确实不同。所以我假设test() 传递了t.context 的deepCopy。

避免让test() 修改共享的t.context 是有意义的。所以这个行为结合我在test.before()里面设置lNewIterator,意味着我在测试开始后修改了共享的t.context,但是因为每个测试都有一个本地深拷贝,所以他们没有收到修改。

我将在test() 中设置lNewIterator,因为在test.before() 退出后修改共享的t.context 似乎是一种反模式。

【问题讨论】:

  • 什么是t,什么是MessageReceiver,你为什么期望lNewIterator对象被任何东西使用?
  • 好问题,我为上下文添加了一些额外的代码(包括一些类型)。 tava 的执行上下文,它被 ava 测试运行器传递给相关的测试函数(test.beforetest)。 MessageReceiver 是被测类。我已将lNewIterator 传递给MessageReceiver 的模拟依赖项之一。 lNewIterator的结果会在与注入依赖的asyncIterator交互时返回给MessageReceiverzmq是注入的依赖。
  • 返回到MessageReceiver 的结果将是一个承诺。这个 promise 的解析器将位于对象 t.contexttest.before
  • "我已将 lNewIterator 传递给 MessageReceiver 的模拟依赖项之一。" - 不,或者至少不在您发布的代码中。 const lNewIterator =before 回调中的一个局部变量,从未使用过。你把lMockManager.mock(Symbol.asyncIterator, lNewIterator);也放在那里了吗?
  • 抱歉没有更清楚,lNewIterator 的结果将作为第二个参数传递给lMockManager.mock()。然后存储结果并在每次被测对象调用Symbol.asyncIterator时返回。

标签: javascript node.js ava


【解决方案1】:

来自test.before()t.context 确实被复制了,虽然很浅。尝试将回调存储在 t.context.callback = { fn: null } 之类的对象上或类似的东西上。

查看您的注入代码,我认为您最好使用串行测试和beforeEach() 挂钩。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-03
    相关资源
    最近更新 更多