【问题标题】:Writing Test Case using Mocha and Chai for a function with response.send( )使用 Mocha 和 Chai 为带有 response.send( ) 的函数编写测试用例
【发布时间】:2020-05-21 21:10:47
【问题描述】:

我是第一次在 node.js 中进行测试。我在下面创建了一个简单的程序。一个 html 表单有两个字段,名称和年龄。当用户提交表单时,年龄在'ageVerification.js'中的证书函数中检查,因为它应该大于18。如果年龄小于18,则返回null,否则返回一些随机数。有相同的 getAuth 函数抛出错误,然后我将使用它进行测试 expect(auth.getAuth.bind(this,req,{})).to.throw('whatever thrown') 但是如果函数刚刚以 res.send("some string") 结束,那么如何测试函数。提前致谢。

  **code to test**
    const certificate=require('./ageVerification')
    module.exports.getAuth=function(req,res){
    if(certificate.certificate(req.body.ageText)!=null && 
            req.body.uName=='prateek'){
            res.write("Hello Prateek")
            return res.end()
        }

        if(certificate.certificate(req.body.ageText)!=null && 
            req.body.uName!='prateek')
            return res.send("You need to register first")

        if(certificate.certificate(req.body.ageText)==null){
             res.write("You are not of required age")
             return res.end()
        }
   }

 **test case**
const certificate=require('../ageVerification')
const auth=require('../controller')
const chai=require('chai')
const expect=require('chai').expect;
describe("Age field is null",function(){
    it("name is correct",function(done){
        const req={
            body:{
                ageText:null,
                uName:'prateek'
            }
        }
         expect(auth.getAuth.bind(this,req,{})).[I'm stuck here ???]

    })
})

【问题讨论】:

    标签: node.js unit-testing mocha.js chai


    【解决方案1】:

    您需要使用sinonjs 为res.send、res.write 和res.end 方法制作存根并断言它们是否已被调用以检查代码逻辑。

    例如

    controller.js:

    const certificate = require('./certificate');
    
    module.exports.getAuth = function(req, res) {
      if (certificate.certificate(req.body.ageText) != null && req.body.uName == 'prateek') {
        res.write('Hello Prateek');
        return res.end();
      }
    
      if (certificate.certificate(req.body.ageText) != null && req.body.uName != 'prateek')
        return res.send('You need to register first');
    
      if (certificate.certificate(req.body.ageText) == null) {
        res.write('You are not of required age');
        return res.end();
      }
    };
    

    certificate.js:

    exports.certificate = function(age) {
      return age;
    };
    

    controller.test.js:

    const auth = require('./controller');
    const sinon = require('sinon');
    
    describe('61943894', function() {
      afterEach(() => {
        sinon.restore();
      });
      it('should return required age message', function() {
        const mReq = {
          body: {
            ageText: null,
            uName: 'prateek',
          },
        };
        const mRes = {
          write: sinon.stub().returnsThis(),
          send: sinon.stub().returnsThis(),
          end: sinon.stub(),
        };
        auth.getAuth(mReq, mRes);
        sinon.assert.calledOnceWithExactly(mRes.write, 'You are not of required age');
        sinon.assert.calledOnce(mRes.end);
      });
    
      it('should say hello', () => {
        const mReq = {
          body: {
            ageText: 29,
            uName: 'prateek',
          },
        };
        const mRes = {
          write: sinon.stub().returnsThis(),
          send: sinon.stub().returnsThis(),
          end: sinon.stub(),
        };
        auth.getAuth(mReq, mRes);
        sinon.assert.calledOnceWithExactly(mRes.write, 'Hello Prateek');
        sinon.assert.calledOnce(mRes.end);
      });
    
      it('should return register message', () => {
        const mReq = {
          body: {
            ageText: 29,
            uName: '',
          },
        };
        const mRes = {
          write: sinon.stub().returnsThis(),
          send: sinon.stub().returnsThis(),
          end: sinon.stub(),
        };
        auth.getAuth(mReq, mRes);
        sinon.assert.calledOnceWithExactly(mRes.send, 'You need to register first');
      });
    });
    

    带有覆盖率报告的单元测试结果:

      61943894
        ✓ should return required age message
        ✓ should say hello
        ✓ should return register message
    
    
      3 passing (34ms)
    
    ----------------|---------|----------|---------|---------|-------------------
    File            | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
    ----------------|---------|----------|---------|---------|-------------------
    All files       |     100 |       90 |     100 |     100 |                   
     certificate.js |     100 |      100 |     100 |     100 |                   
     controller.js  |     100 |       90 |     100 |     100 | 12                
    ----------------|---------|----------|---------|---------|-------------------
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-07
      • 2023-03-10
      • 1970-01-01
      • 2021-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-11
      相关资源
      最近更新 更多