Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript t、 ava中的上下文范围_Javascript_Node.js_Ava - Fatal编程技术网

Javascript t、 ava中的上下文范围

Javascript t、 ava中的上下文范围,javascript,node.js,ava,Javascript,Node.js,Ava,我90%确定是什么导致了这个问题,但我想澄清一下ava是如何处理t.context的。以下是我的设想: const lMockManager = ImportMock.mockClass<zmq.Dealer>(zmq, "Dealer"); lMockManager.mock(Symbol.asyncIterator, lNewIterator); test.before((t: ExecutionContext<TTestContext) =>

我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
});
const lMockManager=ImportMock.mockClass(zmq,“经销商”);
lMockManager.mock(Symbol.asyncierator、lNewIterator);
test.before((t:ExecutionContext
{
t、 上下文=
{
DummyData:[],
承诺人:空,
ZMQMock:lMockManager,
};
常量lNewIterator=(()=>
{
返回{
异步下一步()
{
返回新承诺((解析:(aValue:string[])=>void:void=>
{
t、 context.PromiseCallback=解析;
});
},
};
})();
});
测试(“接收消息”,t:ExecutionContext
{
const lMessageReceiver=new MessageReceiver();//将ZMQ作为dep导入
lMessageReceiver.Start();//这会触发t.PromiseCallback的创建
t、 context.PromiseCallback(“hello world”);//错误:t.context.PromiseCallback为null
});
出于测试目的,我将
test.before()
t.context
推入一个全局对象,并将其与
test()
t.context
进行比较,确认对象确实不同。因此我假设
test()
传递了
t.context
的深度副本

这有助于避免让
test()
修改共享
t.context
。因此,此行为与me设置
lNewIterator
内部
test.before()相结合
,表示我在测试开始后修改了共享的
t.context
,但因为每个测试都有一个本地深度副本,所以它们没有收到修改


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

t.context
from
test.before()
确实被复制了,尽管很肤浅。请尝试将回调存储在对象上,如
t.context.callback={fn:null}
或类似的内容


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

什么是
t
,什么是
MessageReceiver
,为什么您希望
lNewIterator
对象被任何对象使用?好问题,我为上下文添加了一些额外的代码(包括一些类型).
t
ava
的执行上下文,它通过ava测试运行程序进入相关的测试函数(
test.before
test
).
MessageReceiver
是被测试的类。我已将
lNewIterator
传递给
MessageReceiver
的一个模拟依赖项。
lNewIterator
与注入依赖项的
异步迭代器
交互时,其结果将返回给
MessageReceiver
zmq
是注入的依赖项。返回给
MessageReceiver
的结果将是一个承诺。此承诺的解析程序将位于
t.context
测试中的对象
t.context
中。在
之前,“我已将
lNewIterator
传递给
MessageReceiver
的一个模拟依赖项。”-不,或者至少不在您发布的代码中。
const lNewIterator=
之前的
回调中从未使用过的局部变量。是否放置了
lMockManager.mock(Symbol.asyncierator,lNewIterator)
也在里面?很抱歉没有说得更清楚,
lNewIterator
的结果将作为第二个参数传递给
lMockManager.mock()
。然后存储结果,并在每次被测对象调用
Symbol.asyncIterator
时返回。