NodeJS函数的Mocha测试不调用Callback

时间:2016-04-29 18:11:06

标签: node.js facebook testing request mocha

我有一个使用Facebook页面向Facebook用户发送消息的功能。

// send text message to an user
function sendTextMessage(sender, text, callback) {
    messageData = {
        text: text
    }
    request({
        url: 'https://graph.facebook.com/v2.6/me/messages',
        qs: { access_token: token },
        method: 'POST',
        json: {
            recipient: { id: sender },
            message: messageData,
        }
    }, function (error, response, body) {
        if (error) {
            console.log('Error sending message: ', error);
            callback(-1);
        } if (response.body.error) {
              console.log('Error: ', response.body.error);
              return -2;
          } else{
            console.log('Ok: ' + JSON.stringify(body));
            callback(1);
            return response;
        }

    });
}

我的问题是,当我在命令行上运行此代码时,它工作正常,但是,我尝试使用mocha为此创建测试。

it('Text Message', function(){
    var fb_answer = function(res){
      // first schema to be compared
      var fbTextAnswerSchema = {
        "title": "fb answer schema v1",
        "type": "object",
        "required": ["recipient_id", "message_id"],
        "recipient_id": {
           "type": "string"
        },
        "message_id": {
           "type": "string"
        }
      };
      expect(res).to.be.jsonSchema(fbTextAnswerSchema);
    }
    messenger.sendTextMessage(sender, "[TEST] Testing send text message", fb_answer);
  });

当我在命令行上运行mocha调用此测试时,它不仅会通过,而且还不会打印响应的主体。

基本上奇怪的是,当我使用node运行时代码打印响应,当我使用mocha运行时,它不会,这让我觉得请求的回调没有被调用...

我需要将测试函数作为回调函数传递给此函数,以便处理响应。

为什么没有打印回复?为什么没有调用回调?有没有更好的方法来测试这种功能?

先谢谢。

1 个答案:

答案 0 :(得分:1)

您可以在describe块内执行此类操作。所有mocha钩子函数都有一个done回调函数,用于在进行断言之前调用异步调用并设置环境

// first schema to be compared
var fbTextAnswerSchema = {
    "title": "fb answer schema v1",
    "type": "object",
    "required": ["recipient_id", "message_id"],
    "recipient_id": {
        "type": "string"
    },
    "message_id": {
        "type": "string"
    }
};

var res;
before(function(done){
    messenger.sendTextMessage(sender, "[TEST] Testing send text message", function(response){
        res = response;
        done()
    });
})

it('Text Message', function(){
    expect(res).to.be.jsonSchema(fbTextAnswerSchema);
});

或只是

it('Text Message', function(done){
    messenger.sendTextMessage(sender, "[TEST] Testing send text message", function(response){
        expect(res).to.be.jsonSchema(fbTextAnswerSchema);
        done()
    });
});

选择

是一种风格问题