2016-07-13 8 views
2

私はExpressとPassportを使用しているアプリを持っています。私はPassportでGoogle OAuth2戦略を使用しています。私はこの戦略を通じてログインが必要ないくつかのルートを持っています。エクスプレスとパスポートのテストOAuth2 with Mocha and Chai

現在のところ、MochaとChaiとの統合テストを行っていますが、いくつかのルートで必要なOAuth2認証をバイパスする方法や作業する方法がわかりません。例えば

、ここに私のテストのいずれかです。

it("should list a single item on /items/<id> GET", function(done) {                    
    chai.request(server) 
    .get('/items/' + id) 
    .end(function(err, res) { 
     res.should.have.status(200); 
     res.should.be.json; 
     res.body.should.be.a('object'); 
     res.body.should.have.property('description'); 
     done(); 
    }); 
}); 

/items/:id

router.get('/items/:id', auth.isLoggedIn, function(req, res) { 
    var item = getItem(); 
    res.json(item); 
}); 

/items/:idのための私のルートはログインが必要です。テストのためにログインをバイパスする方法、または私の統合テストがうまくいくことをユーザーに嘲笑する方法はありますか?

答えて

0

、あなたは、ログインするユーザーが必要とする機能をテストすることができ、あなたがしたい場合は、それを回避するために、独自のメソッドを作ることができますが、最高のは、ログインをテストすることである。

私は決してきたんあなたはおそらくそのような何かを行うことができますが、前に使用チャイ:

var user = null; 

it("should log the user in", function(done) {                    
    chai.request(server) 
    .post('/login', userCredentials) 
    .end(function(err, res) { 
     res.should.have.status(200); 
     user = res.body; 
     done(); 
    }); 
}); 
+2

これに伴う問題は、それがGoogleの認証にリダイレクトし、多くのコールバックを必要とグーグルのOAuth2認証方式を使用しています。典型的なローカル認証方法ではありません。 – intargc

+0

@intargc - 私はgithubのために働いています - サンプルコードを見てください、OAuthのノッキングとAPIリクエストはGoogleのために似ているはずです、あなたが遭遇した問題を教えてください! – stujo

1

は、私は私のモカテスト中に要求オブジェクトににisAuthenticatedをあざけることによって、この作品を作る方法を考え出しました。

var chai = require('chai'); 
var chaiHttp = require('chaiHttp'); 
var server = require('../app'); 
var should = chai.should(); 

chai.use(chaiHttp); 

// Allows the middleware to think we're already authenticated. 
server.request.isAuthenticated = function() { 
    return true; 
} 

describe('Items', function() { 
    it('should list all items on/GET', function(done) { 
    chai.request(server) 
     .get('/') 
     .end(function(err, res) { 
     res.should.have.status(200); 
     res.should.be.json; 
     // more tests... 
     done(); 
     }); 
    }); 
}); 
3

IトークンのURL

アウト

nock-github-oauthスタブが手動githubのユーザをnockedモカチャイチャイ-HTTPノックとノック-githubの-のOAuthとgithubののOAuth /パスポートをテストすることができたと電子メールのAPIは、GitHubのAPIのドキュメントからのサンプルを呼び出します

これは私のauth_controller_spec.js

//During the test the env variable is set to test 
process.env.NODE_ENV = 'test'; 

var chai = require('chai'); 
var chaiHttp = require('chai-http'); 
var should = chai.should(); 
var expect = chai.expect 

var User = require.main.require('models/User'); 

// https://gist.github.com/branneman/8048520#7-the-wrapper 
var app = require.main.require('app'); 

chai.use(chaiHttp); 


function nockGitHubUserAPI(nock) { 
    /** 
    * Intercept `https://api.github.com:443/user` API Call. 
    */ 
    nock('https://api.github.com:443') 
    .filteringPath(/\/user.+/, '/user') 
    .get('/user') 
    .reply(200, 
     { 
     "login": "octocat", 
     "id": 1, 
     "avatar_url": "https://github.com/images/error/octocat_happy.gif", 
     "gravatar_id": "", 
     "url": "https://api.github.com/users/octocat", 
     "html_url": "https://github.com/octocat", 
     "followers_url": "https://api.github.com/users/octocat/followers", 
     "following_url": "https://api.github.com/users/octocat/following{/other_user}", 
     "gists_url": "https://api.github.com/users/octocat/gists{/gist_id}", 
     "starred_url": "https://api.github.com/users/octocat/starred{/owner}{/repo}", 
     "subscriptions_url": "https://api.github.com/users/octocat/subscriptions", 
     "organizations_url": "https://api.github.com/users/octocat/orgs", 
     "repos_url": "https://api.github.com/users/octocat/repos", 
     "events_url": "https://api.github.com/users/octocat/events{/privacy}", 
     "received_events_url": "https://api.github.com/users/octocat/received_events", 
     "type": "User", 
     "site_admin": false, 
     "name": "monalisa octocat", 
     "company": "GitHub", 
     "blog": "https://github.com/blog", 
     "location": "San Francisco", 
     "email": "[email protected]", 
     "hireable": false, 
     "bio": "There once was...", 
     "public_repos": 2, 
     "public_gists": 1, 
     "followers": 20, 
     "following": 0, 
     "created_at": "2008-01-14T04:33:35Z", 
     "updated_at": "2008-01-14T04:33:35Z" 
     } 
    ); 

/** 
* Intercept `https://api.github.com:443/user/emails` API Call. 
*/ 
    nock('https://api.github.com:443') 
    .filteringPath(/\/user\/emails.+/, '/user/emails') 
    .get('/user/emails') 
    .reply(200, 
     [ 
     { 
      "email": "[email protected]", 
      "verified": true, 
      "primary": true 
     } 
     ] 
    ); 
} 


describe('Auth Controller', (done) => { 

    var user, nock, github, mockToken, githubHost; 

    before((done) => { 
    nock = require('nock'); 
    nock.enableNetConnect('127.0.0.1'); 
    github = require('nock-github-oauth'); 

    nockGitHubUserAPI(nock) 

    github.nock(done); 
    }) 

    beforeEach((done) => { //Before each test we reset the database 
    User.query().del().then(() => { 
     var params = {name: 'bonzo', authtype: 'github', authid: '12345678'} 
     // Create a user so the db isn't empty 
     // May help us uncover odd bugs 
     new User(params).save() 
     .then((bonzo) => { 
      user = bonzo; 
      done(); 
     }) 
    }) 
    }); 

    after(function(done) { 
     nock.cleanAll(); 
     done(); 
    }); 

    describe('github link',() => { 
     it('it should redirect to github.com login/approve page', (done) => { 
     chai.request(app) 
      .get('/auth/github') 
      .redirects(0) 
      .end((err, res) => { 
       expect(res.headers['location']).to.match(/^https:\/\/github.com\/login\/oauth\/authorize/); 
       done(); 
      }); 
     }); 
    }); 

    describe('github callback',() => { 
     it(' should poll github api for details, upsert the user and log them in', (done) => { 
     var agent = chai.request.agent(app) 
      agent.get('/auth/github/callback') 
      .query({code : '9835b716e83875665b21' }) 
      .end((err, res) => { 
       // If successful layout displays username on page in (brackets) 
       expect(res.text).to.match(/\(octocat\)/); 
       done(); 
      }); 
     }); 
    }); 


    describe('logout',() => { 
     it('it should end the session and show login', (done) => { 
     chai.request(app) 
      .get('/auth/logout') 
      .end((err, res) => { 
       expect(res.redirects[0]).to.match(/\/$/); 
       // If successful layout displays Login links 
       expect(res.text).to.match(/Login/); 
       done(); 
      }); 
     }); 
    }); 

}); 
です

ここでは完全なソースコード:https://github.com/stujo/node-express-gamebase

関連する問題