2016-12-20 9 views
0

Целью является восстановление тестов api. Этот тест является своего рода интеграционными тестами, они загружают все приложение со всеми его посредниками и перехватывают внешние HTTP-вызовы и записывают их.Запишите все удаленные вызовы в экспресс-приложении nodejs для тестирования

В мире Python существует «WebTest» и «VCRPY» для этого.

Приложение:

'use strict'; 

const express = require('express'); 
const request = require('superagent'); 

var app = express(); 

app.get('/hammer/version', function(req, res) { 
    request 
     .get('http://httpbin.org/get') 
     .end(function(err, response) { 
      console.log(response.body); 
      res.status(200).json({ 
       version: '0.1.0', 
       url: response.body.url 
      }); 
     }); 
}); 

module.exports = app; 

Тест:

/* global describe, it */ 
'use strict'; 

const request = require('supertest'); 
const app = require('./app.js'); 

var path = require('path'); 
var tape = require('tape'); 
var tapeNock = require('tape-nock'); 

// call tapeNock with tape and an options object 
var test = tapeNock(tape, { 
    fixtures: path.join(__dirname, 'fixtures') 
}); 

describe('Version test', function() { 
    this.timeout(0); 

    it('test version', function(done) { 
     test('record_version.json', function(t) { 
      request(app) 
       .get('/hammer/version') 
       .expect(200, { 
        url: "http://httpbin.org/get", 
        version: '0.1.0' 
       }) 
       .end(function(err, res) { 
        if (err) return done(err); 
        t.end(); 
        done(); 
       }); 
     }); 
    }); 
}); 

"package.json":

{ 
    "name": "remote_node_test", 
    "version": "1.0.0", 
    "description": "", 
    "main": "app.js", 
    "dependencies": { 
    "express": "^4.14.0", 
    "mocha": "^3.2.0", 
    "nock": "^9.0.2", 
    "superagent": "^3.3.1", 
    "supertest": "^2.0.1", 
    "tape": "^4.6.3", 
    "tape-nock": "^1.4.0" 
    }, 
    "devDependencies": { 
    "mocha": "^3.2.0" 
    }, 
    "scripts": { 
    "test": "mocha" 
    }, 
    "author": "", 
    "license": "ISC" 
} 

Тест запускаются с "мокко":

NOCK_BACK_MODE=record node_modules/mocha/bin/mocha 

Первый запуск работ, второй запуск с «блокировкой/записью» не работает.

Ошибка:

% NOCK_BACK_MODE=lockdown node_modules/mocha/bin/mocha test.js                                :(


    Version test 
TAP version 13 
# details.json 
    1) return current version 


    0 passing (32ms) 
    1 failing 

    1) Version test return current version: 
    TypeError: Cannot read property 'status' of undefined 
     at Test._assertStatus (node_modules/supertest/lib/test.js:263:10) 
     at Test._assertFunction (node_modules/supertest/lib/test.js:281:11) 
     at Test.assert (node_modules/supertest/lib/test.js:171:18) 
     at Server.assert (node_modules/supertest/lib/test.js:131:12) 
     at emitCloseNT (net.js:1553:8) 
     at _combinedTickCallback (internal/process/next_tick.js:71:11) 
     at process._tickCallback (internal/process/next_tick.js:98:9) 

Записан все запросы, но мне нужно только для записи «внешних» запросов, и предотвратить «насмешливую/запись» мою внутреннюю логику.

ответ

2

Если вы используете мокко, вы можете искать себе подобных зарубки/nockBack хелперов, которые мокко специфические (https://www.npmjs.com/search?q=mocha+nock)

При этом, вы можете также столкнуться с проблемами, где HTTP-вызов supertest делает приложение, которое получает, получает nockBack.

Я сделал небольшой пример, который использует только ленту, чтобы делать то, что вы пытаетесь достичь: https://github.com/Flet/tape-nock-with-supertest-example

afterRecord и до функций, определенных в настройке-магнитофоны nock.js, вероятно, секретный соус вы бы нужно даже при использовании какого-либо другого помощника mocka nockBack.

Надеюсь, это поможет!

+0

FYI, я обновил этот пример, чтобы использовать новейшую «ленту-носок», которая использует пару новых функций, которые делают все лучше (defaultTestOptions и каталог настроек по умолчанию). https://github.com/Flet/tape-nock-with-supertest-example – Flet

0

Одно решение кажется «replay» и настройка «passThrough» запросов к моему локальному приложению.

/* global describe, it */ 
'use strict'; 

const request = require('supertest'); 
const app = require('./app.js'); 

var path = require('path'); 
const Replay = require('replay'); 

Replay.fixtures = __dirname + '/fixtures/replay'; 
Replay.passThrough('localhost', '127.0.0.1', '0.0.0.0'); 

describe('Version test', function() { 
    this.timeout(0); 

    it('test version', function(done) { 
     request(app) 
      .get('/hammer/version') 
      .expect(200, { 
       url: "http://httpbin.org/get", 
       version: '0.1.0' 
      }) 
      .end(function(err, res) { 
       if (err) return done(err); 
       done(); 
      }); 
    }); 
});