2017-10-16 145 views
1

我有一個Express服務器,我正在使用Passport-local進行身份驗證。我有以下受保護的路線:Mocha Chai測試受保護的路線

app.post("/api/test", connect.ensureLoggedIn("/"), (req, res) => { 
let test = new Test(req.body); 

test 
    .save() 
    .then(data => { 
    return res.json(data); 
    }) 
    .catch(e => { 
    return res.status(HTTP_RESPONDE_BAD_REQUEST).send(e); 
    }); 
}); 

我在想如何測試上面提到的路線,以確保用戶登錄。

這是我目前的測試(沒有通過,因爲我不是能夠發送驗證:

it("Testing protected route", done => { 
chai 
    .request(server) 
    .post("/api/test") 
    .send(test) 
    .end((err, res) => { 
    expect(res.status).to.equal(200); 
    done(); 
    }); 
}); 

我曾嘗試以下,但是當我運行測試他們重定向我到登錄頁面。

it("Testing protected route", done => { 
chai 
    .request(server) 
    .post("/api/test") 
    .set('Authorization', 'Bearer ' + token) // user token id 
    .send(test) 
    .end((err, res) => { 
    expect(res.status).to.equal(200); 
    done(); 
    }); 
}); 

it("Testing protected route", done => { 
chai 
    .request(server) 
    .post("/api/test") 
    .set('token', token) // user token id 
    .send(test) 
    .end((err, res) => { 
    expect(res.status).to.equal(200); 
    done(); 
    }); 
}); 

有沒有對此進行測試更簡單的方法?

+0

你的第二個例子是這樣做,除了你需要登錄或以其他方式創建一個有效的'token'以正確的方式使用。 – doublesharp

+0

我正在使用有效的令牌。它在郵差上工作正常 – Glund

+0

我在我的應用程序中做的事情幾乎完全相同,它使用有效的令牌(並假設您有正確的標頭)正常工作。 – doublesharp

回答

0

我使用我的單元測試supertestmocha以及自定義頭呃爲令牌,但我正在爲我的測試使用類似的模式。在運行任何測試之前,將數據加載到數據庫並且用戶已登錄,然後將該令牌用於需要驗證的每個測試。

TestUtils類

this.authenticateUser = (user, app) => 
    new Promise((resolve, reject) => { 
     request(app) 
     .post('/authenticate') 
     .send({ 
     email: user.email, 
     password: user.test_password, 
     }) 
     .end((err, res) => { 
     if (err) { 
      return reject(err); 
     } 
     return resolve(res.body.token); 
     }); 
    }); 

測試類

describe('Authed Routes',() => { 
    let app = null; 

    let authUser = null; 

    before((done) => { 
    // mocking should happen before the app is created. 
    app = require('../server'); 

    // Populate redis data 
    TestUtils.populateRedis(() => { 
     // Populate db data 
     TestUtils.syncAndPopulateDatabase('public-tests',() => { 
     // Get the test user 
     authUser = TestUtils.getUser(); 
     // Authenticate the user to get a token 
     TestUtils.authenticateUser(authUser, app) 
     .then((accessToken) => { 
      // Keep the token on the user so we can use it in the tests 
      authUser.access_token = accessToken; 
      return done(); 
     }) 
     .catch((err) => done(err)); 
     }); 
    }); 
    }); 

    describe('/secure/route',() => { 
    it('should allow /secure/route with correct token provided', (done) => { 
     request(app) 
     .get('/secure/route') 
     // add the access token from the user as a header value 
     .set('x-access-token', authUser.access_token) 
     .expect(200) 
     .end((err, res) => { 
     done(); 
     }); 
    }); 
    }); 
}); 
相關問題