2016-04-29 84 views
1

我有一個功能,使用Facebook頁面發送消息給Facebook用戶。摩卡測試NodeJS功能不調用回調

// 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; 
     } 

    }); 
} 

我的問題是,當我在命令行上運行此代碼時,它工作正常,但是,我試圖爲此使用摩卡創建一個測試。

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); 
    }); 

當我運行命令行調用這個測試摩卡,它不僅通過,但它也不會打印響應體。

基本上這裏有什麼奇怪的是,當我運行使用節點代碼打印響應,並且當我用摩卡運行時,它沒有,這使我認爲請求的回調沒有被調用。 ..

我需要將測試函數作爲回調傳遞給此函數以處理響應。

爲什麼不打印迴應?爲什麼回調沒有被調用?有沒有更好的方法來測試這種功能?

謝謝先進。

回答

1

你可以在describe塊內做這樣的事情。所有摩卡鉤子函數有一個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() 
    }); 
}); 

這是一個風格問題之前馴服異步調用和設置你的環境,你所選擇

+0

謝謝,這解決了我的問題。有沒有一種方法不使用res作爲全局?因爲我想測試這樣的三種不同的函數,並且聽起來不像是製作三個全局變量的好方法。另外,我需要運行sendTextMessage的其他兩種變體,是否有爲每個測試創建一個before語句的方法? – Ernanirst