2016-11-23 3 views
0

Ich habe Abnahmetests für meine Bibliothek erstellt. Wenn die Bibliothek veröffentlicht wird, verwendet sie einen externen API-Dienst, auf den noch nicht zugegriffen werden kann. Also habe ich einen Mock JSON API Server erstellt, der das benötigte JSON zum Testen liefert. Was ich tun muss, um die Tests zu bestehen, ist die manuelle Änderung der API-URL in der Datei, in der die Anfrage gestellt wird.Entwicklungs-API für Knoten JS-Abnahmetests

Ich frage mich, ob es eine Möglichkeit gibt, die Pseudo-API-URL beim Ausführen der Abnahmetests zu verwenden und zur Live-URL zurückzukehren, wenn die Abnahmetests nicht ausgeführt werden. Im Folgenden finden Sie einen Codeausschnitt mit einer Live-URL.

return fetch('http://liveURL.com/api') 
    .then(response => { 
    if (response.status === 200) { 
     return response.json() 
     .then(myResponse => { 
      var theResponse = myResponse.id; 

      return theResponse; 
     }); 
    } else { 
     return response.json().then(error => { 
     throw new Error(error.error); 
     }); 
    } 
    }); 

Was ich tun möchte, wenn die Abnahmetests laufen nur die URL ändern, ‚http://liveURL.com/api‘, ich bin die Anfrage bekommen von zu ‚http://localhost:3000/api‘.

Der Mock-Server kann ich bin mit finden Sie hier: https://github.com/typicode/json-server

EDIT: In Antwort auf Bens Fragen, Hier ist meine package.json, wo ich die NODE_ENV

{ 
    "name": "my-lib", 
    "version": "0.1.0", 
    "description": "", 
    "main": "lib/myLib", 
    "private": true, 
    "scripts": { 
    "lint": "gulp lint", 
    "pretest": "npm run lint", 
    "test": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter spec \"test/unit/**/*.spec.js\"", 
    "acceptance-test": "NODE_ENV=test cucumberjs", 
    "build": "gulp build" 
    }, 
    "author": "Me", 
    "license": "ISC", 
    "devDependencies": { 
    "babel-preset-es2015": "^6.16.0", 
    "babel-register": "^6.16.3", 
    "babelify": "^7.3.0", 
    "browserify": "^13.1.0", 
    "chai": "^3.5.0", 
    "chai-as-promised": "^5.3.0", 
    "config-browserify": "^1.0.5", 
    "cors": "^2.8.1", 
    "cucumber": "^0.10.3", 
    "eslint": "^3.0.1", 
    "eslint-teamcity": "^1.1.0", 
    "express": "^4.14.0", 
    "gulp": "^3.9.1", 
    "gulp-eslint": "^3.0.1", 
    "gulp-sourcemaps": "^1.6.0", 
    "gulp-uglify": "^2.0.0", 
    "isomorphic-fetch": "^2.2.1", 
    "istanbul": "v1.1.0-alpha.1", 
    "jsdom": "^9.8.3", 
    "json-server": "^0.9.1", 
    "mocha": "^2.5.3", 
    "mocha-jsdom": "^1.1.0", 
    "mocha-teamcity-reporter": ">=0.0.1", 
    "nock": "^9.0.0", 
    "node-localstorage": "^1.3.0", 
    "portscanner": "^2.1.0", 
    "proxyquire": "^1.7.10", 
    "selenium-server": "^2.53.0", 
    "selenium-webdriver": "^2.53.2", 
    "semver": "^5.3.0", 
    "serve-static": "^1.11.1", 
    "sinon": "^1.17.4", 
    "sinon-chai": "^2.8.0", 
    "vinyl-buffer": "^1.0.0", 
    "vinyl-source-stream": "^1.1.0", 
    "watchify": "^3.7.0" 
    }, 
    "dependencies": { 
    "config": "^1.21.0" 
    } 
} 

ich gesetzt bin versucht, habe meine zwei Server in world.js erstellt. Ein Server der Bibliothek, an dem auf Port 23661 und einem Server, auf dem die gefälschte api ist, auf dem 3000. Port ist, kann dieses

'use strict'; 

const SeleniumServer = require('selenium-webdriver/remote').SeleniumServer; 
const webdriver = require('selenium-webdriver'); 
const server = new SeleniumServer(require('selenium-server').path, {port: 4444}); 
const serveStatic = require('serve-static'); 
const express = require('express'); 
const chaiAsPromised = require('chai-as-promised'); 
const chai = require('chai'); 
const jsonServer = require('json-server'); 
const cors = require('cors'); 

chai.should(); 
chai.use(chaiAsPromised); 

const testServer = jsonServer.create(); 
const router = jsonServer.router('db.json'); 

testServer.use(cors()); 
testServer.options('*', cors()); 
testServer.use(router); 
testServer.listen(3000); 

const app = express(); 
const httpServerPort = 23661; 
app.use(cors()); 
app.options('*', cors()); 
app.use(serveStatic('dist')); 
app.use(serveStatic(__dirname + '/../page')); 
app.use(serveStatic('node_modules/sinon/pkg')); 
app.listen(httpServerPort); 

server.start(); 

unter

gesehen werden, wenn diese ausgeführt wird, läuft es durch die Abnahmetests korrekt in Firefox Browser.

Die Datei, wo ich

process.env.NODE_ENV 

ist in meiner minimierte Bibliothek Anruf myLib.min.js rufen versuchen.

Hier ist ein Teil der unminified Datei

'use strict'; 

const fetch = require('isomorphic-fetch'); 

module.exports = id => { 
    var apiUrl = 'http://liveurl.com/api/' + id; 

    if (process.env.NODE_ENV === 'development') { 
    apiUrl = 'http://localhost:3000/api'; 
    } 

    console.log(process.env.NODE_ENV); 

    return fetch(apiUrl) 
     .then(response => { 
     if (response.status === 200) { 
      return response.json() 
      .then(myResponse => { 
       var theResponse = myResponse.id; 

       return theResponse; 
      }); 
     } else { 
      return response.json().then(error => { 
      throw new Error(error.error); 
      }); 
     } 
     }); 
}; 

Antwort

1

Diese im Allgemeinen durch die Verwendung von environment variables gelöst.

Etwas wie:

var apiUrl = 'http://localhost:3000/api' 
if (process.env.NODE_ENV === 'production') { 
    apiUrl = 'http://liveurl.com/api'; 
} 

return fetch(apiUrl) 
    .then(response => { 
    //... and so on 

Dann würden Sie Ihre App (oder führen Sie Ihre Tests) wie folgt beginnen, für NODE_ENV in der entsprechenden Umgebung Namen zu füllen. Gemeinsame Werte sind Produktion | Test | Entwicklung:

NODE_ENV=production node ./path/to/app.js 
+0

Danke, also ich meine Testserver in world.js mit dem Befehl Start ‚NPM lief Akzeptanz-Test‘, so wäre es in world.js sein, wo ich gesetzt der NODE_ENV? –

+0

Nein, Sie würden 'NODE_ENV = test npm run acceptance-test' laufen lassen. – Ben

+0

ok, also habe ich '" abnahme-test ":" NODE_ENV = entwicklung gurken "' in meinem package.json. Wenn ich nun 'npm run acceptance-test' starte, werden meine Tests mit 'NODE_ENV' auf' development 'gesetzt? Wenn ich jedoch 'console.log (process.env.NODE_ENV)' 'zu meinem Code hinzufüge, bevor die if-Anweisung, die Sie angegeben haben, sagt, dass sie' undefiniert' ist. –