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