2016-06-20 5 views
0

私はmochaとsupertestを使ってRESTサービスをテストしています。この場合、GETリクエストの後の次のログインがそのGETリクエストからのクエリを返すことをテストする必要があります。'it'specの後に実行されるbeforeEachからのコード

  1. ログインユーザ
  2. はparamsは
  3. ログインユーザを使用してエンドポイント(複数可)にGET要求を行い、応答としてGET要求からのparamsを期待します。

上記のテストは、様々なエンドポイントに対して数回行われようとしているので、これは私が出ているものです:

/* 
* getRequest.js 
*/ 
'use strict'; 

var request = require('supertest') 
    , verifyUrl = require('./verifyUrl') // verifies basic url formatting 
    ; 

module.exports = getRequest; 

/** 
* Perform GET request using given parameters and call next when finished. 
* @param getEnvironment {json} 
* @param getEnvironment.url {string} 
* @param getEnvironment.endPoint {string} 
* @param getEnvironment.authorization {string} 
* @param next {function} The callback 
*/ 
function(getEnvironment, getParams, next) { 
    var url = verifyUrl(getEnvironment.url); 
    request(url) 
     .get(getEnvironment.endPoint) 
     .set("authorization", getEnvironment.authorization) 
     .set('Accept', 'application/json') 
     .query(getParams) 
     .end(next) 
} 

/* 
* loginWithCallback.js 
* 
* Performs a basic login but depends on the callback to test the results of the login. 
*/ 
'use strict'; 

var request = require('supertest') 
    , VerifyUrl = require('./VerifyUrl') 
    ; 

module.exports = LoginWithCallback; 

/** 
* Perform basic login, then call next passing in err and res for testing. 
* 
* @param setEnvironment {json} Expects url and authorization. Any other parameters will be ignored. 
* @param setEnvironment.url {string} The url being tested. 
* @param setEnvironment.authorization {string} 
* @param next {function} callback function that will perform the actual test. 
*/ 
function LoginWithCallback(setEnvironment, next) { 

    var url = VerifyUrl(setEnvironment.url); 

    request(url) 
     .post('api/users/login') 
     .set('authorization', setEnvironment.authorization) 
     .set('Accept', 'application/json') 
     .end(next); 
} 

/* 
* e2eTest.js 
*/ 
'use strict'; 

var base64_encode = require('Base64').btoa 
    , should = require('should') 
    , jsonValidator = require('is-my-json-valid') 
    , mergeJSON = require('lodash/merge') 
    , lodashClone = require('lodash/clone') 
    , responseSchema = require('./responseSchemas/200.json') 
    , login = require('./loginWithCallback') 
    , getRequest = require('./getRequest') 
    ; 

var username = "newUser" + Date.now() 
    , password = "passW0rd" 
    , testEnvironment = { 
     "url": "http://localhost:9000/", 
     "endPoint": "api/users/login", 
     "authorization": "Basic " + base64_encode(username + ":" + password) 
    } 
    ; 

var expectedResult = {}; 

describe('End to End testing on' + JSON.stringify(testEnvironment), function() { 
    describe('new user, ' + username + ', login', function() { 
     it('should return 200 and an empty body message.', function (done) { 
      login(testEnvironment, function (err, res) { 
       if (err) { 
        done(err); 
       } 

       res.statusCode.should.deepEqual(200); 

       var jsonValidate = jsonValidator(responseSchema, {verbose: true}); 
       jsonValidate(res.body).should.be.true("Response body failed schema check: \n" + 
        JSON.stringify(jsonValidate.errors, null, 4)); 

       res.body.should.deepEqual(expectedResult); 

       done(); 
      }); 
     }); 
    }); 


    describe('user, ' + username + ', logs in after performing get request', function() { 
     var getRequestParams = {"firstName":"john", "lastName":"doe"}; 

     beforeEach(function() { 
      var getEnviron = lodashClone(testEnvironment); 
      getEnviron.endPoint = 'api/persons/findName'; 
      mergeJSON(expectedResult, {"persons": {"findName": getRequestParams}}); 
      getRequest(getEnviron, getReqestParams, function(err, res) { 
       if (err) { 
        done(err); 
       } 
       console.log("GET request: " JSON.stringify(res, null, 2)); 
       done(); 
      }); 
     }); 

     it('should return 200 and query values', function(done) { 
      login(testEnvironment, function (err, res) { 
      if (err) { 
       done(err) 
      } 

      console.log("it test: " + JSON.stringify(res, null, 2)); 

      res.statusCode.should.deepEqual(200); 

      var jsonValidate = jsonValidator(responseSchema, {verbose: true}); 
      jsonValidate(res.body).should.be.true("Response body failed schema check: \n" + JSON.stringify(jsonValidate.errors, null, 4)); 

      res.body.should.deepEqual(expectedResult); 

      done(); 

     }); 
    }); 
}); 

何上記の3つのファイルは、次のようになっています: 1.新しいusを作成するer 2.新しいユーザーにログインし、以前のクエリパラメータがない場合の応答をテストします。 (パス) 3. GET要求を実行し、前のブロックに結果を出力します。 4.ユーザープリントのログインを実行し、itブロックでテスト結果をテストします。

しかし、私は取得していますがのようなものです:見ることができるように

End to End testing on{"url":"http://localhost:9000/","endPoint":"api/users/login","authorization":"Basic bmV3VXNlcjE0NjY0NDI0OTEzNDc6cGFzc1cwcmQ="} 
    new user, newUser1466442491347, login 
    ✓ should return 200 and an empty body message. (54ms) 

    user, newUser1466442491347, logs in after performing persons/findByName request 
it test: [res text] 
    1) should return and query values 
GET request: [res text] 

1 passing 
1 failing 

    Uncaught AssertionError: expected Object {} to equal Object { 
    persons: Object { findByName: Object { firstName: 'joe', lastName: 'jones' } } 
} 

、「ブロックはブロックが終了する前に前に実行するように表示されています。私のモカの読書から、これはbeforeとbeforeがそれぞれ 'it'ブロックを実行する前に終了するのを待つので、起こるべきではありません。しかし、おそらく、getRequestのコールバックはブロックされた後にキューに入れられますか?

私は間違ったことや誤解をしていますか?

答えて

1

モカはそれが非同期であることを知っているように、あなたは間違いなくあなたbeforeEachフックを設定する必要があります:あなたはモカに約束を返すか、doneコールバックを使用しますか。 doneコールバックを使用するためには、doneを取るコールバックを宣言する必要があります。

beforeEach(function (done) { 

(あなたはとても長い間、あなたが)後でfinished()を呼び出す(一貫性があるとして、あなたが欲しいもの(例えばfinished)、それを呼び出すことができます。)

+0

私の質問の最後のコードブロックは十分ではありませんでしたか?しかし、私が正しくerrを処理していないことを認識して、私は次のように修正しました(これは 'res'を除いています。なぜなら私はそうしていないからです。 (または上の質問で編集してください) – Machtyn

+0

@Machtynいいえ、それを使用します): 'getRequest(getEnvironment、getRequestParams、function(err){if(err){done(err);} done();})それだけでは十分ではなかった。あなた自身がここで指摘しているように、あなたは「誤り」を扱っていませんでした。物事が適切な順序で実行されると、誤りが明らかになる場合があります。また、私は、あなたがあなたの質問に示していない何かを宣言しなければならないことについて、本当に混乱していることを知るために、モカについて十分な質問に答えました。 (いいえ、実際には宣言したり、間違った場所で宣言することを忘れる人もいます)また、 'getRequest'の後に' mergeJSON'を置くことは安全ではありません。それがここの要素であるかどうかは不明だが、それでもなお。 – Louis

+0

質問を編集して最初に表示する必要のある内容を表示したら、この回答を喜んで削除します。私が言ったように、**あなたのフックが非同期であることをモカに伝えなければなりません。だから、あなたのフックのために最初に表示したコード( 'done'なし)は間違っています。あなたがコードのより良いバージョンを持っているので、それを示しても意味がありません: 'done'を使うバージョンです。 'done'で実行するフックを正確に表示するために質問を編集し、このコードを実行するときにどのような動作をするかを説明する必要があります*。 – Louis

関連する問題