javascript - 如何正确模拟套接字连接以模拟各种 on.('data' 事件
问题描述
我正在测试一种基于从套接字过滤的数据返回 Promise 的方法:
async readData(sConn) {
if(!sConn) {
throw new Error('READ_SOCK_ERROR');
}
let rawData;
return new Promise((resolve, reject) => {
sConn.on('data', async (data) => {
try {
rawData = data.toString();
return resolve(rawData);
} catch (error) {
return reject(new Error(`Error reading response. Details: ${error.stack}`));
}
}
}
}
如何正确模拟套接字连接,以便模拟在数据事件中发送的各种数据?这就是我正在使用的,但测试挂起并最终超时....
it('It should not throw error and return simulated data string', async function () {
let result;
let error = false;
let mockedData = 'This is\na simultated response\nfrom the socket';
const sConn = {
on: () => Promise.resolve(mockedData),
};
try {
result = await rewiredFileContainingMethodToTest.readData(sConn);
console.log(result);
} catch (err) {
error = err;
console.log('Error caught: '+err);
}
expect(error).to.be.false;
sinon.assert.callCount(sConn.on, 1);
expect(result).contains(mockedData);
});
解决方案
您可以使用stub.callsFake(fakeFunction)
,它在调用时使存根调用提供fakeFunction
。
例如
file.js
:
const file = {
async readData(sConn) {
if (!sConn) {
throw new Error('READ_SOCK_ERROR');
}
let rawData;
return new Promise((resolve, reject) => {
sConn.on('data', async (data) => {
try {
rawData = data.toString();
return resolve(rawData);
} catch (error) {
return reject(new Error(`Error reading response. Details: ${error.stack}`));
}
});
});
},
};
export { file };
file.test.js
:
import { expect } from 'chai';
import sinon from 'sinon';
import { file } from './file';
describe('65594632', () => {
it('It should not throw error and return simulated data string', async function () {
let mockedData = 'This is\na simultated response\nfrom the socket';
const sConn = {
on: sinon.stub().callsFake(async (event, callback) => {
await callback(mockedData);
}),
};
const result = await file.readData(sConn);
sinon.assert.callCount(sConn.on, 1);
expect(result).to.be.equal(mockedData);
});
});
单元测试结果:
65594632
✓ It should not throw error and return simulated data string
1 passing (7ms)
----------|---------|----------|---------|---------|-------------------
File | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s
----------|---------|----------|---------|---------|-------------------
All files | 81.82 | 50 | 100 | 80 |
file.ts | 81.82 | 50 | 100 | 80 | 4,15
----------|---------|----------|---------|---------|-------------------
推荐阅读
- php - WooCommerce:如何检查特定产品是否存在元密钥
- python - 当值高于列中位数(1,否则为0)时,如何将数据转换为二进制?
- regex - 正则表达式,如何匹配:字符串 + 中间任意数量的字符 + 字符串
- excel - MATCH 函数在某些单元格上显示错误,但对其他单元格有效
- python - 如何获取更新的旋转框值 - tkinter
- python-3.x - 如何修复 ImportError:无法从“html.parser”导入名称“HTMLParseError”?
- javascript - 在反应中添加键盘快捷键以打开编辑表单
- ruby-on-rails - 尽管 ACM 被禁用,Heroku 在 acme-challenge 上重定向
- python - Tensorflow 值错误:无法为形状为“(?,1)”的张量“Placeholder_5:0”提供形状(8009,)的值
- python - Python:对于列表中的每 2 个项目?