2015-12-14 69 views
1

我正在嘗試使用Mocha和Supertest測試API,但沒有幸運地使其正常工作。 我有以下代碼:無法通過Mocha和Supertest進行身份驗證請求

var supertest = require('supertest'); 
describe('Routing', function() { 
    var url = 'http://example.com'; 
    var server = supertest.agent(url); 

    var credentials = { 
     user: 'username', 
     pass: 'password' 
    }; 


    describe('Login', function() { 

     it('should login ok given valid credentials', function(done) { 
      server 
       .post('/login.php') 
       .send(credentials) 
       .end(function(err, res) { 
        if (err) { 
         throw err; 
        }     
        server.saveCookies(res); 
        done(); 
       }); 
     }); 


     it('should correctly make an authenticated request', function(done){ 
      server 
       .get('/api/me/accounts?_=1449865354112') 
       .end(function(err,res) { 
        if (err) { 
         throw err; 
        } 
        res.status.should.be.equal(200); 
        done(); 
       }); 
     }); 
    }); 
}); 

登錄請求正常工作,我得到驗證。第二個調用會引發401狀態。 我閱讀了文檔,但無法完成工作。

出了什麼問題? 謝謝!

UPDATE: 我終於用.field('user', 'myUsername').field('pass', 'myPassword')發送PARAMS認證。

此外,我必須堅持不同的電話之間的cookie: cookie = res.headers['set-cookie'];當我通過身份驗證,和.set('cookie', cookie)在接下來的請求。

回答

0

這是因爲會話(cookie)不會在兩次測試之間持續存在。

  • 首先你應該在同一個測試中做兩個調用。
  • 第二,我記得我已經使用superagent來持續兩次調用同一個服務器之間的會話。但是現在看來,supertest現在讓代理堅持會話。

    var supertest = require('supertest'); 
    var app = express(); 
    var agent = supertest.agent(app); 
    // then you can persist cookie 
    agent 
        .post('/login.php') 
        .auth(credentials) 
        ... 
    

編輯: 這裏是如何我已經使用的SuperAgent用於測試的例子:

var request = require('superagent'); 
    var postData= { 
     email: '[email protected]', 
     password: 'test' 
    }; 

    var user1 = request.agent(); 
     user1.post('http://localhost:3000/user/login') 
     .send(postData) 
     .end(function (err, res) { 
      expect(err).to.not.exist; 
      expect(res.status).to.equal(200); 
      var result = res.body; 
      expect(result.data.message).to.equal('Login successful'); 

      user1.get('http://localhost:3000/user') 
      .end(function (err, res) { 
       expect(err).to.not.exist; 
       expect(res.status).to.equal(200); 
       var result = res.body; 
       expect(result.data.email).to.equal('[email protected]'); 
       done(); 
      }); 
     }); 
+0

謝謝,但我必須在該代碼中的域名?我仍然無法使它的工作:( – Hernan

+0

我已經添加了我如何使用superagent爲我的單元測試的示例。 – Sachacr

+0

您是否修復了您的問題? – Sachacr

0

.send()是爲您的數據。 .auth()是爲您的憑據。請嘗試:

it('should login ok given valid credentials', function(done) { 
    server 
     .post('/login.php') 
     .auth(credentials) 
     .send({"some": "value"}) 
     .expect(200) 
     .end(function(err, res) { 
      if (err) { 
       done(error); 
      }     
      server.saveCookies(res); 
      done(); 
     }); 
}); 

請參閱http://visionmedia.github.io/superagent/docs/test.html瞭解更多關於supertest的信息。

相關問題