2013-10-17 128 views
3

我一直在搜索這個站點和web一段時間,我無法找到解決這個問題的方法。我正在嘗試測試API的REST函數,但PUT測試似乎從未奏效。每次測試運行摩卡時,我都會收到錯誤「Uncaught assertion error:expected [] to equal {objectData}」,其中objectData是我嘗試發佈的對象(名爲couponTwo)的json表示形式。在Mocha中使用Supertest來測試Node.js Express API和MongoDB

我有一種感覺,問題在於beforeEach函數,因爲它在每次測試之前清除數據庫,這需要爲許多其他測試正常運行而完成。下面是測試代碼:

var config = require('../config/config'); 
var mongoose = require('mongoose'); 
var should = require('should'); 
var request = require('supertest'); 
var Coupon = require('../models/coupon'); 
var url = require('../config/config').test.url; 

process.env.NODE_ENV = 'test'; 

beforeEach(function (done) { 

    function clearCollections() { 
    for (var collection in mongoose.connection.collections) { 
     mongoose.connection.collections[collection].remove(function() {}); 
    } 
    return done(); 
    } 

    if (mongoose.connection.readyState === 0) { 
    mongoose.connect(config.test.db, function (err) { 
     if (err) throw err; 
     return clearCollections(); 
    }); 
    } else { 
    return clearCollections(); 
    } 
}); 

afterEach(function (done) { 
    mongoose.disconnect(); 
    return done(); 
}); 

這裏是一個應該來測試對象在數據庫中的PUT後存在:

describe('#post', function() { 
it('should return a coupon object after post', function (done) { 
request(url).post('/coupons') 
    .set('Content-Type', 'application/json') 
    .send(couponTwo) 

    request(url).get('/coupons').end(function (err, res) { 
    if (err) throw err; 
    console.log(res.body); 
    res.body.should.eql(couponTwo); 
    done(); 
    }) 
}) 
}) 

我很抱歉,如果這個問題的答案是顯而易見的,我錯過了一些基本的東西,但我遇到了障礙。謝謝你的幫助!

回答

0

我認爲這是因爲請求調用的異步性質。您需要在回調中包裝第二個請求,以便只有在完成第一個請求並將測試對象放入數據庫時​​纔會執行該請求。

另外,無論如何,.eql(couponTwo)都會失敗,因爲您的響應是包含放入的對象的數組,並且您直接將其與對象進行比較。如果您想確保它是數組中的唯一元素,或者只使用.containEql(couponTwo),請使用.eql([couponTwo])

試試這個:

request(url).post('/coupons') 
.set('Content-Type', 'application/json') 
.send(couponTwo) 
.end(function() { 
    request(url).get('/coupons').end(function (err, res) { 
    if (err) throw err; 
    console.log(res.body); 
    res.body.should.containEql(couponTwo); 
    done(); 
    }); 
}); 
相關問題