gpt4 book ai didi

javascript - 在 NodeJS 中,如何测试由解析 POST API 请求的类方法发出的事件?

转载 作者:太空宇宙 更新时间:2023-11-04 02:09:10 25 4
gpt4 key购买 nike

基本上,我正在测试一个 StreamReader,它在执行 POST 请求时发出事件,导致流读取器解析并发出 data 事件。

我使用 mochachai(使用 chai-http)和 sinon.spy 来测试特定场景,其中调用 REST API 的类接收响应,然后在响应处理程序中向其他事件监听器发出“data”事件。

我已经阅读了很多有关使用 chai-http 和 Promises 来通过断言和期望测试响应的内容。为此,我尝试使用相同的模式来测试数据事件,但即使使用 Promise,sinon.spy 监听器也不会在 Promise 完成且测试用例完成后触发。

关于测试用例...

第一次尝试 - 使用 sinon.spy 作为回调

it('should emit a "data" event when one record is POSTed and parsed', function() {
let spy = sinon.spy();
let reader = new Reader(sync_query);
reader.on('data', spy);
return chai.request(SYNC_URI)
.post('/db/_bulk_docs')
.set("Content-type", "application/json")
.send({ "docs": [{"user": "tempura"}, {"user": "shrimp"}] })
.then(function(response){
expect(response.body).to.have.lengthOf(2);
sinon.assert.calledOnce(spy);
// Executes too soon. I can see the event in another listener's logs.
// I'd like the test to run until the spy fires or a timeout occurs.
})
.catch(function(error) {
throw error;
});
// EXITS BEFORE EVENTS are triggered?
});

编辑 1 - 使用标准回调

it('should emit a "data" event when one record is POSTed and parsed', function() {
let reader = new CouchReader(sync_query);
// This works perfectly to catch when the event is fired but...
reader.on('data', function(evt) {
try {
assert.isOk(evt);
done();
} catch (error) {
done(error);
}
});
chai.request(SYNC_GATEWAY_URI)
.post('/db/_bulk_docs')
.set("Content-type", "application/json")
.send({ "docs": [{"user": "toszter"}, {"user": "bartacus"}] })
.then(function(response){
// ...the next expect doesn't get caught when thrown.
// Can't return chai.request as a promise b/c of the callback.
expect(response.body).to.have.lengthOf(3);
})
.catch(function(error) {
throw error;
});
this.timeout(4000);
});

我想知道是否...

  1. 我应该将下面的代码转换为延迟的 Promise 并将整个 block 返回给 mocha,因为 chai.request 中的断言与回调中的断言正交,但两者都会影响测试的结果,或者...
  2. 我应该将其分成两个单独的测试,分别测试各个单元...一个用于回调事件发出,另一个用于响应 /db/_bulk_docs 请求?

您可能会投票给选项 2,是吗?

我尝试使用非 Promise 版本,通过传递 done (正确吗?),然后 setImmediate() ,现在考虑 process.nextTick() 但首先,我和其他有更多经验的人一样使用 mocha (等)来测试类似的场景:

  1. 如何防止测试用例完成,直到事件被监听器捕获或在 30 秒的静默后超时?
  2. 我应该使用普通 NodeJS request 模块吗?

如果有重复的内容,请原谅我,但在我的搜索中,我找不到......

最佳答案

这可能不是最好的答案,但我已经找到了解决方案。我的OP是一个集成测试的问题,而不仅仅是一个单元。我正在尝试测试(这些单元):

  1. 对数据库网关服务器的 API 请求工作并响应输入。
  2. 数据库网关服务器事件由 Reader Class API 监视器“检测”。
  3. data 事件由 Reader 类发出。
  4. data 事件与我发送到 API 请求的输入打包在一起。

对于一个测试用例和宝贵的一课来说,这太多了

相反,我独立测试每个案例,仅使用每个案例需要的代码。

describe.only('#message', function() {
it('should emit a "bdata" event when message is called.', function() {
let spy = sinon.spy();
let reader = new Reader(sync_query);
reader.on('data', spy);
reader.message({obj: {last_seq: 1}});
sinon.assert.calledOnce(spy); // Hooray, it works!
});
});

但如果我真的想要一举完成端到端集成测试,那么为什么不呢?正如他们在 Pushkar 中所说的那样。

describe('#message event', function() {
it('should emit a "data" event when Server saves data via Gateway APIs', function(done) {
let reader = new CouchReader(sync_query);
reader.on('data', function(evt) { // <-- I could make this a spy()
try {
assert.isOk(evt);
// assert the event payload here
done();
} catch (error) {
done(error);
}
});
chai.request(SYNC_GATEWAY_URI)
.post('/db/_bulk_docs')
.set("Content-type", "application/json")
.send({ "docs": [{"user": "toszter"}, {"user": "bartacus"}] })
.catch(function(error) {
throw error;
});
this.timeout(4000);
});
});

...在这种情况下,如果超时,那么我就失去了桨,新的任务开始了。

关于javascript - 在 NodeJS 中,如何测试由解析 POST API 请求的类方法发出的事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43026295/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com