Javascript t、 ava中的上下文范围
我90%确定是什么导致了这个问题,但我想澄清一下ava是如何处理t.context的。以下是我的设想: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) =>
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
fromtest.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
时返回。