2013-06-19 25 views
3

第一次運行會創建一個用戶,第二次運行會從服務器獲取用戶。 WaitsFor應該會導致第二次運行等待,直到第一次運行完成。但是,在運行node-jasmine時,打印before: 51c21c1ef463390000000008後,測試停止,但未發出get請求。jasmine-node waitsFor()停止所有未來運行()

我試過取出waitsFor,但這會導致請求發生在發佈請求之前,這會導致它失敗,因爲它取決於新用戶的userid

發生了什麼事?

var request = require('request'); 

describe("User", function(){ 
    var userid; 
    it ("creates user", function(){ 

    runs(function(){ 
     var username = 'test' + Math.floor((Math.random()*100000)+1); 

     var body = { 
     username: username, 
     email: username + "@test.com", 
     password: username + "@test.com" 
     }; 

     var options = { 
     uri: 'http://localhost:3000/api/user', 
     method: 'POST', 
     headers: { 
      'Content-type': 'application/json' 
     }, 
     body: JSON.stringify(body) 
     }; 


     request(options, function(err, res, body) { 
     expect(res.statusCode).toEqual(200); 
     console.log(body); 
     var newUser = JSON.parse(body)[0]; 
     userid = newUser._id; 
     console.log("before: "+ userid); 

     expect(newUser.toBeTruthy()); 
     }); 
    }); 

    waitsFor(function() { 
     console.log(typeof userid != "undefined"); 
     return (typeof userid != "undefined"); 
    }, "userid is never set", 10000); 

    //it ("gets user", function() { 
    runs(function(){ 
     expect(userid).toBeFalsy(); 
     console.log("this: "+userid); 
     request.get("http://localhost:3000/api/user/" + userid, function(err, res, body){ 
     console.log("statuscode:" + res.statusCode); 
     expect(res.statusCode).toEqual(2000); 
     expect(body).toBeTruthy(); 
     console.log('Response: ' + body); 
     }); 
    }); 
    }); 
}); 

回答

0

這可能是更容易使用done()功能,您可以傳遞到beforeEach,我試圖將其應用到這裏下面你的榜樣;

var request = require('request'); 

describe("User", function() { 
    var getBody; 
    var getRes; 
    var newUser; 
    var postBody; 
    var postRes; 
    var userId; 

    beforeEach(function(done) { 
    var username = 'test' + Math.floor((Math.random() * 100000) + 1); 

    request({ 
     uri: 'http://localhost:3000/api/user', 
     method: 'POST', 
     headers: { 
     'Content-type': 'application/json' 
     }, 
     body: JSON.stringify({ 
     username: username, 
     email: username + "@test.com", 
     password: username + "@test.com" 
     }) 
    }, function(err, _postRes, _postBody) { 
     postRes = _postRes; 
     postBody = _postBody; 
     newUser = JSON.parse(postBody)[0]; 
     userId = newUser._id; 

     request.get("http://localhost:3000/api/user/" + userId, function(err, _getRes, _getBody) { 
     getRes = _getRes; 
     getBody = _getBody; 
     done(); 
     }); 
    }); 
    }); 

    it("creates user", function() { 
    expect(postRes.statusCode).toEqual(200); 
    expect(newUser.toBeTruthy()); 
    expect(getRes.statusCode).toEqual(2000); 
    expect(getBody).toBeTruthy(); 
    }); 
});