Javascript 如何增加基本Typescript示例上Mocha测试的代码覆盖率?

Javascript 如何增加基本Typescript示例上Mocha测试的代码覆盖率?,javascript,node.js,typescript,mocha.js,Javascript,Node.js,Typescript,Mocha.js,我想更好地理解如何使用mocha在Typescript中测试这些函数。即,我有以下小文件: import { Request, Response } from 'express'; export const ping = (req: Request, res: Response) => { res.send('pong'); }; export const health = (req: Request, res: Response) => { res.send('

我想更好地理解如何使用mocha在Typescript中测试这些函数。即,我有以下小文件:

import { Request, Response } from 'express';

export const ping = (req: Request, res: Response) => {
    res.send('pong');
};

export const health = (req: Request, res: Response) => {
    res.send('OK');
};
这个练习可能很简单,因为这里没有太多的测试,但下面我有一些基本的摩卡测试:

 describe('Health Tests', () => {
    it('Check ping', () => {
        expect(ping).to.not.be.null;
    })
    it('Check health', () => {
        expect(health).to.not.be.null;
    })
})
当我在这个测试上运行代码覆盖率时,我得到:50%Stmts | 100%Branch | 0%Funcs | 50%行。特别是因为这是一段非常小的代码,如果可能的话,我希望对所有类别都有100%的覆盖率。有人对如何做到这一点有什么建议吗?另外,有人能解释一下为什么我的功能覆盖率为0%吗?通过检查
ping
health
,我是否也调用了一个函数,从而也测试了该函数


任何建议都将不胜感激

您需要使用类似的模拟/存根库。以下是100%覆盖率的单元测试解决方案:

index.ts

从“express”导入{Request,Response};
导出常量ping=(请求:请求,回复:响应)=>{
res.send(“pong”);
};
导出常量运行状况=(请求:请求,回复:响应)=>{
res.send('OK');
};
index.test.ts

从“/”导入{ping,health};
从“sinon”进口sinon;
描述('63065938',()=>{
描述(#ping,()=>{
它('应该通过',()=>{
常量mReq={};
const mRes={send:sinon.stub()};
ping(mReq、mRes,如有);
sinon.assert.calledWith(mRes.send,'pong');
});
});
描述(#健康,()=>{
它('应该通过',()=>{
常量mReq={};
const mRes={send:sinon.stub()};
健康(mReq、mRes,如有);
sinon.assert.calledWith(mRes.send,'OK');
});
});
});
100%覆盖率的单元测试结果:

63065938
#平
✓ 应该通过
#健康
✓ 应该通过
2次通过(12毫秒)
----------|---------|----------|---------|---------|-------------------
文件|%Stmts |%Branch |%Funcs |%Line |未覆盖行|s
----------|---------|----------|---------|---------|-------------------
所有文件| 100 | 100 | 100 | 100 |
index.ts | 100 | 100 | 100 | 100 |
----------|---------|----------|---------|---------|-------------------

您需要使用类似的模拟/存根库。以下是100%覆盖率的单元测试解决方案:

index.ts

从“express”导入{Request,Response};
导出常量ping=(请求:请求,回复:响应)=>{
res.send(“pong”);
};
导出常量运行状况=(请求:请求,回复:响应)=>{
res.send('OK');
};
index.test.ts

从“/”导入{ping,health};
从“sinon”进口sinon;
描述('63065938',()=>{
描述(#ping,()=>{
它('应该通过',()=>{
常量mReq={};
const mRes={send:sinon.stub()};
ping(mReq、mRes,如有);
sinon.assert.calledWith(mRes.send,'pong');
});
});
描述(#健康,()=>{
它('应该通过',()=>{
常量mReq={};
const mRes={send:sinon.stub()};
健康(mReq、mRes,如有);
sinon.assert.calledWith(mRes.send,'OK');
});
});
});
100%覆盖率的单元测试结果:

63065938
#平
✓ 应该通过
#健康
✓ 应该通过
2次通过(12毫秒)
----------|---------|----------|---------|---------|-------------------
文件|%Stmts |%Branch |%Funcs |%Line |未覆盖行|s
----------|---------|----------|---------|---------|-------------------
所有文件| 100 | 100 | 100 | 100 |
index.ts | 100 | 100 | 100 | 100 |
----------|---------|----------|---------|---------|-------------------

我认为您缺少的是测试调用这些函数的结果。这些测试只是检查函数(保存函数引用的变量)是否存在,而不是它的执行和实际结果当函数的结果是res.send()时,我如何在mocha测试中访问该结果?这些函数不返回任何内容(从技术上讲,它们返回
未定义的
)。测试一个基于参数返回值的函数总是比较容易的,因此以这种方式编写尽可能多的函数以获得最大的可测试性。您不能总是这样做,但是在这种情况下,您仍然需要调用它们,并且您的断言需要针对它们的副作用执行,也就是说它们如何影响
res
。我认为您缺少的是测试调用这些函数的结果。这些测试只是检查函数(保存函数引用的变量)是否存在,而不是它的执行和实际结果当函数的结果是res.send()时,我如何在mocha测试中访问该结果?这些函数不返回任何内容(从技术上讲,它们返回
未定义的
)。测试一个基于参数返回值的函数总是比较容易的,因此以这种方式编写尽可能多的函数以获得最大的可测试性。您不能总是这样做,但是在这种情况下,您仍然需要调用它们,并且您的断言需要针对它们的副作用执行,也就是说它们如何影响
res