2017-10-16 187 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(); 
     }); 
    }); 
    }); 
}); 
相关问题