2017-02-25 5 views
0

私は雇用主からテストプロジェクトを与えられ、彼は自分のアプリに対していくつかのテストを提供しました。そして私が最後のものに達したとき、私は誤りの言葉を得ました。誰でも私に何を言ってもらえますか?私のapp.jsところで提供されたテストファイルの_userとは何ですか

'use strict' 

let assert = require('chai').assert 
let request = require('supertest-as-promised') 

let app = require('../../app') 
let email = 'integration_test_' + Math.floor(Date.now()/1000) + '@wartech.ua' 
let password = 'test' 
let name = 'My name' 

describe('Authentication Controller',() => { 

    it('should register a new user and return token',() => { 
    let _token = null; 

    return request(app) 
     .post('/api/register') 
     .send({ email, password, name }) 
     .expect(201) 
     .then((data) => { 
     _token = data.body.token; 
     assert.ok(_token); 
     }); 
    }); 

    it('should login existing User',() => { 
    let _token = null; 
    return request(app) 
     .post('/api/login') 
     .send({ email, password }) 
     .expect(200) 
     .then((data) => { 
     _token = data.body.token; 
     assert.ok(_token); 
     }); 
    }); 

    it('should return an error bad request if email is used',() => { 
    return request(app) 
     .post('/api/register') 
     .send({ email, password, name}) 
     .expect(400); 
    }); 

    it('should return an error bad request if email isn\'t specified',() => { 
    return request(app) 
     .post('/api/register') 
     .send({ password, name }) 
     .expect(400); 
    }); 

    it('should return an error bad request if password isn\'t specified',() => { 
    return request(app) 
     .post('/api/register') 
     .send({ email, name }) 
     .expect(400); 
    }); 
}); 

describe('Profile controller',() => { 

    let _token = null; 

    before(() => { 
    return request(app) 
     .post('/api/login') 
     .send({ email, password }) 
     .then((data) => { 
     _token = data.body.token; 
     assert.ok(_token); 
     }); 
    }); 

    it('should fetch the profile info of existing user',() => { 
    return request(app) 
     .get('/api/profile') 
     .set('Authorization', 'Bearer ' + _token) 
     .expect(200) 
     .then((data) => { 
     assert.equal(data.body.email, _user); 
     }); 
    }); 

    it('should return an error when token is not specified',() => { 
    return request(app) 
     .get('/api/profile') 
     .expect(401); 
    }); 
}); 

は次のようになります。

'use strict'; 
//require packages 
let express = require('express'); 
let app = express(); 
let bodyParser = require('body-parser'); 
let morgan = require('morgan'); 
let mongoose = require('mongoose'); 
let jwt = require('jsonwebtoken'); 
let config = require('./config'); 
let User = require('./models/user'); 
let router = express.Router(); 
//connect database 
mongoose.connect(config.database); 
app.set('superSecret', config.secret); 
//configure express 
app.use(bodyParser.urlencoded({ extended: true })); 
app.use(bodyParser.json()); 
app.use(morgan('dev')); 
app.use('/api', router); 

//index route 
app.get('/', function(req, res) { 
    res.send('Hello'); 
}); 
//user create route 
router.post('/register', function(req, res) { 

    //search if user with this email exists 
    User.findOne({ email: req.body.email }, function(err, user) { 
     if (err) { 
      console.log(err); 
     } else if (user) { 
      //provide status response if true 
      res.status(400).json({ 
       success: false, 
       message: 'User with this email already exists' 
      }); 
     } else { 
      //if email isn't provided - response with status code 400 
      if (!req.body.email) { 
       res.status(400).json({ 
        success: false, 
        message: 'Email wasn\'t provided' 
       }) 
      } else { 
       //if everything is ok create user and save 
       User.create({ 
        email: req.body.email, 
        password: req.body.password, 
        name: req.body.name 
       }, function(err, newUser) { 
        if (err) { 
         console.log(err); 
        } else { 
         // create a token 
         let token = jwt.sign(newUser, app.get('superSecret'), { 
          expiresIn: "24h", // expires in 24 hours 
          issuer: newUser.name 
         }); 
         // return the information including token as JSON 
         res.status(201).json({ 
          success: true, 
          message: 'Register successful, token sent', 
          token: token 
         }); 
        } 
       }); 
      } 
     } 
    }); 
}); 

router.post('/login', function(req, res) { 

    // find the user 
    User.findOne({ 
     email: req.body.email 
    }, function(err, user) { 

     if (err) throw err; 

     if (!user) { 
      res.json({ success: false, message: 'Authentication failed. User not found.' }); 
     } else if (user) { 

      // check if password matches 
      if (user.password != req.body.password) { 
       res.json({ success: false, message: 'Authentication failed. Wrong password.' }); 
      } else if (!req.body.email) { 
       //check if email provided 
       res.json({ success: false, message: 'Authentication failed. No email was provided. ' }); 
      } else if (!req.body.email == user.email) { 
       //check if email matches 
       res.json({ success: false, message: 'Authentication failed. E-mail doesn\'t match. ' }); 
      } 

      // if user is found and password is right 
      // create a token 
      let token = jwt.sign(user, app.get('superSecret'), { 
       expiresIn: "24h" // expires in 24 hours 
      }); 

      // return the information including token as JSON 
      res.json({ 
       success: true, 
       message: 'Enjoy your token!', 
       token: token 
      }); 
     } 



    }); 
}); 
router.get('/profile', checkToken, function(req, res) { 
    res.json({ 
     name: req.decoded._doc.name, 
     email: req.decoded._doc.email 
    }) 
}); 

function checkToken(req, res, next) { 
    console.log(req.headers['authorization']); 
    var token = req.body.token || req.query.token || req.headers['authorization']; 

    // decode token 
    if (token) { 

     // verifies secret and checks exp 
     jwt.verify(token, app.get('superSecret'), function(err, decoded) { 
      if (err) { 
       return res.json({ success: false, message: 'Failed to authenticate token.' }); 
      } else { 
       // if everything is good, save to request for use in other routes 
       req.decoded = decoded; 
       next(); 
      } 
     }); 

    } else { 
     console.log('token not found'); 

     // if there is no token 
     // return an error 
     return res.status(401).send({ 
      success: false, 
      message: 'No token provided.' 
     }); 

    } 

} 

app.listen(3000, function() { 
    console.log('Server started'); 
}); 

module.exports = app; 

私はまだ最後のテストは私に不正なエラー401を与える理由を把握しようとしています。 x-access-tokenを許可に切り替えると、refエラーが出ました。まあ、私は仕事の大部分をして、最後に立ち往生した。助言がありますか?

+0

ながら使用するテストemailを使用する必要があり、このようにすることができますテストケースは 'assertの直前に'既存のユーザのプロフィール情報を取得するべきです '' console.log(data.body.email) ' –

+0

を実行してください。 –

+0

私はトークンを取り戻すことができないので、プログラムロジックの問題は依然として存在します。そして私は雇用主に連絡し、このミスを変数で修正できるかどうか私に言いました。私は自分のトークン認証にパスポートを使い、あなたの答えに応じてその変数を定義する方法を見つけようとします。偉大な仲間は、私が編集テストをカント、応答をありがとう、問題はp0k8_ @ –

答えて

0

_userコードに定義されていない変数です。比較演算子==を内部的に使用するassert.equal()を使用してdata.body.emailと比較するのに使用される 。資格情報が満たしていないとき

401 unauthorizedエラーが 、発生_userは、あなたのコード内で定義されていないので、それはundefined

を与えているとJWTトークンの有効期限と、ユーザー名、パスワード

をご確認ください。あなたはそれを定義し、

場合1.

上記と同じようにテストケースを使用しますか

ORアサートがdata.body.emailを比較しているとして、ログインが成功した後、このテストケースは、あなたがログインテストケース

場合2.

it('should fetch the profile info of existing user',() => { 
    return request(app) 
     .get('/api/profile') 
     .set('Authorization', 'Bearer ' + _token) 
     .expect(200) 
     .then((data) => { 
     assert.equal(data.body.email, email); 
     }); 
}); 
+0

を、それが終了したときを教え、またはコメントです –

+0

あなたは不正なエラーが発生しなければあなたの問題を確実に解決する鉱山の回答からケース1を使用する必要があります –

+0

申し訳ありませんが、私はまだあなたが言うことを得ることができません:( –

関連する問題