【问题标题】:Unit test with Mocha, I can not make it work用 Mocha 进行单元测试,我无法让它工作
【发布时间】:2017-12-09 21:01:45
【问题描述】:

我正在创建一个单元测试,该测试包括使用 twitter API 来获取任何个人资料的数据(名称、推文数量、关注者、注册日期等)。关键是我正在使用 Mocha 库来执行此任务,但我遇到了问题,即在执行断言时,twitter 请求需要超过 2 秒(Mocha 的默认超时),因此我的测试总是失败。有人可以帮我一把吗?怎么办,这样才能在接收到twitter请求的所有数据后执行assert的比较?

code.js

class extractCode {
    verificarUsername(a) {
        if (a) {
            var nombre;
            var Twitter = require('twitter');
            var client = new Twitter({
              consumer_key: 'XSpj4nEB5IOLgIvyZXiDAhBLt',
              consumer_secret: 'dPjYUTih6n0ynt1y9C7bE0g0gyx6KSJgrGTeDEa3yH5flsdJPL',
              access_token_key: '900532686-4sOwDfOFZm1fKmtZZhSMPH04REXMjqnugTOn3o1j',
              access_token_secret: 'ghNtHt7VyjwNHXvXnZM5hFKaDH62bX7LEFqUBZ9SSb5Lg'
            });

            client.get('users/show', {screen_name: a}, function(error, response) {
              if(error) throw error;
              if(response.name) {
                nombre = true
              } else {
                nombre = false
              };
              console.log(` 
                Nombre: '${response.name}'
                ID: ${response.id_str}
                Localidad: ${response.location}
                Descripción del perfil: ${response.description}
                Seguidores: ${response.followers_count}
                Sigue a: ${response.friends_count}
                Perfil creado el: ${response.created_at}\n`);
            });
            return nombre;
        }


    }
}

module.exports = extractCode;

测试/prueba.js

var assert = require('assert');
var extractCode = require('../code.js');

describe('Pruebas de perfil de Twitter', function() {
    this.timeout(5000);
    var c = new extractCode();
    it('Verifica si se le pasó un username válido', function(done) {

            assert.equal(c.verificarUsername('pedrofumero'),true, 'El username proporcionado no es válido');
            done();



    })

})

【问题讨论】:

    标签: node.js mocha.js


    【解决方案1】:

    您的测试和代码是错误的,在测试第三方 api 请求时,可能 5s 并不是真正的超时值。我对其他第三方 API 的请求需要超过一分钟才能响应。

    这是用 Promise 重写代码的基本方法

    test.js

    var assert = require('assert');
    var extractCode = require('./code.js');
    describe('Twitter profile', function() {
        it('Twitter username verification, expect an actual response', function(done) {
            var c = new extractCode();
            c.verificarUsername('pedrofumero')
            .then(function(response){
                //console.log(response)
                done()
            })
            .catch(function(err){
              throw err;
            });
        })
        it('Twitter username verification, expect an error response', function(done) {
            var c = new extractCode();
            c.verificarUsername('')
            .then(function(response){
                //console.log(response)
                //assert.equal(response.verified,true,'Valid username');
            })
            .catch(function(err){
              assert.equal(err[0].message,'User not found.');
              done()
            });
        })
        it('Twitter username verification, expect an verified profile', function(done) {
            var c = new extractCode();
            c.verificarUsername('pedrofumero')
            .then(function(response){
                assert.equal(response.verified,true,'Valid username');
                done();
            })
            .catch(function(err){
              done(err);
            });
        })
    })
    

    code.js

    var Twitter = require('twitter');
    var client = new Twitter({
      consumer_key: '',
      consumer_secret: '',
      access_token_key: '',
      access_token_secret: ''
    });
    class extractCode {
        verificarUsername(Username) {
            return client.get('users/show', {   screen_name: Username })
        }
    }
    module.exports = extractCode;
    

    输出

    Twitter profile                                                     
      √ Twitter username verification, expect an actual response (610ms)
      √ Twitter username verification, expect an error response (391ms) 
      1) Twitter username verification, expect an verified profile      
    
    
    2 passing (1s)                                                      
    1 failing                                                           
    
    1) Twitter profile                                                  
         Twitter username verification, expect an verified profile:     
    
        AssertionError [ERR_ASSERTION]: Valid username                  
        + expected - actual                                             
    
        -false                                                          
        +true                                                           
    
        at test.js:32:11                                                
        at <anonymous>                                                  
        at process._tickCallback (internal/process/next_tick.js:188:7)  
    

    【讨论】:

    • 如何改变2s默认mocha超时?
    • @PedroFumero 就像您在代码中所做的那样 this.timeout(5000); mocha 将遵守您定义的超时时间,否则在异步测试中期望 done() 调用。没有必要提高超时时间。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-24
    • 2012-05-25
    • 2012-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-02
    相关资源
    最近更新 更多