2013-10-19 4 views
11

Sto scrivendo un test end-to-end utilizzando il goniometro per la mia applicazione angolare. Posso prendere in giro httpBackend per il test delle unità ma in realtà voglio chiamare il server e ottenere la risposta JSON e scrivere nuovamente i dati restituiti.
Ho letto molto su StackOverflow ma non riesco a capire come sia fatto.Test goniometro angolare e2e

Uso $ http? Come faccio a iniettarlo nei miei test Jasmine? Come posso riportare la risposta JSON nel mio test Jasmine?

qualsiasi aiuto o collegamento a risorse con istruzioni su come farlo sarà utile.

Ancora una volta NON voglio prendere in giro il server, voglio colpire il server e recuperare il JSON.

Grazie!

risposta

3

Il goniometro deve essere utilizzato per il test end-to-end dello stack completo.

In questo scenario il test esercita in genere l'applicazione angolare (modulo di riempimento, pulsanti di pressione) che attiverà l'applicazione angolare da chiamare al server REST, che restituisce i dati, che l'applicazione angolare trasforma in modifiche DOM, che quindi il vostro afferma il test end-to-end.

Ciò significa che probabilmente si desidera avviare il server delle applicazioni (che ospita l'applicazione angolare ed è il backend REST, suppongo) prima di iniziare il goniometro

Come farlo è fuori portata per goniometro.

La difficoltà in questo è in genere come configurare il database, in modo che il test e2e sappia cosa aspettarsi dai ritorni ai servizi JSON.

5

Sto lavorando su questo al momento. La risposta breve è che tu configuri la tua applicazione esattamente come se tu fossi testata manualmente da te - quindi Protractor è davvero solo un utente robot, non ha (o quasi) nessun accesso ai componenti interni della tua applicazione.

Quindi, se l'applicazione richiede un server Web (e la maggior parte lo fa), si avvia quel server Web, quindi si dispone di un goniometro per connettersi all'applicazione tramite il browser e di esercitarlo.

per il mio caso, ho intenzione di usare grugnito per chiamare un compito che fa configurazione di base del database prima che inizia a funzionare il mio test E2E goniometro - questo mi dovrebbe dare uno stato di database noto.

Per un esempio di questo, ho scritto un tutorial per l'utilizzo di Rails 4 con AngularJS, la sezione sull'utilizzo di goniometro per il test non è E2E rotaie-specifico e potrebbe essere utile: http://technpol.wordpress.com/2013/11/16/5-end-to-end-testing/

0

Di seguito un esempio di come avviare e arrestare automaticamente un server nodo separato solo durante l'esecuzione dei test di e2e. Un semplice script per il server di simulazione rapida è incluso come esempio di API.

protractor.conf.js

const {SpecReporter} = require('jasmine-spec-reporter'); 
const forever = require('forever-monitor'); 

const child = new (forever.Monitor)('index.js', { 
    max: 10, 
    silent: false, 
    args: ["--port", "3001"], 
    sourceDir: 'mock-server' 
}); 

let startResolve; 
let stopResolve; 
const startPromise = new Promise((resolve) => startResolve = resolve); 
const stopPromise = new Promise((resolve) => stopResolve = resolve); 

child.on('start', function() { 
    console.info('Forever started mocks.'); 
    startResolve(); 
}); 

child.on('restart', function() { 
    console.info('Forever restarting mocks for ' + child.times + ' time'); 
}); 

child.on('exit:code', function (code) { 
    if (code) { 
    console.info('Forever exit mocks with code ' + code); 
    } else { 
    console.info('Forever exited mocks.'); 
    } 
    stopResolve(); 
}); 

exports.config = { 
    allScriptsTimeout: 11000, 
    specs: [ 
    './e2e/**/*.e2e-spec.ts' 
    ], 
    capabilities: { 
    'browserName': 'chrome' 
    }, 
    directConnect: true, 
    baseUrl: 'http://localhost:4200/', 
    framework: 'jasmine', 
    jasmineNodeOpts: { 
    showColors: true, 
    defaultTimeoutInterval: 30000, 
    print: function() { 
    } 
    }, 
    beforeLaunch: function() { 
    child.start(); 

    require('ts-node').register({ 
     project: 'e2e/tsconfig.e2e.json' 
    }); 

    return startPromise; 
    }, 
    onPrepare() { 
    jasmine.getEnv().addReporter(new SpecReporter({spec: {displayStacktrace: true}})); 
    }, 
    onCleanUp() { 
    child.stop(); 

    return stopPromise; 
    } 
}; 

mock-Server/index.js

// npm install --save express 
// npm install --save body-parser 
// npm install --save minimist 

const express = require('express'); 
const bodyParser = require('body-parser'); 
const minimist = require('minimist'); 

const API_DELAY = 0; 
const app = express(); 
app.use(bodyParser.json({limit: '50mb'})); 

// Turn on CORS for browser testing. 
app.use(function (req, res, next) { 
    let accessHeaderInReq = false; 
    if (req.headers.origin) { 
    res.header('Access-Control-Allow-Origin', req.headers.origin); 
    accessHeaderInReq = true; 
    } 
    if (req.headers['access-control-request-method']) { 
    res.header('Access-Control-Allow-Methods', req.headers['access-control-request-method']); 
    accessHeaderInReq = true; 
    } 
    if (req.headers['access-control-request-headers']) { 
    res.header('Access-Control-Allow-Headers', req.headers['access-control-request-headers']); 
    accessHeaderInReq = true; 
    } 
    if (accessHeaderInReq) { 
    res.header('Access-Control-Max-Age', 60 * 60 * 24 * 365); 
    } 

    // Intercept OPTIONS method for angular preflight checks. 
    if (accessHeaderInReq && req.method === 'OPTIONS') { 
    return res.sendStatus(200); 
    } 
    else { 
    next(); 
    } 
}); 

app.get('/api/foo', function (req, res, next) { 
    console.info('GET - returning foo', req.body); 
    setTimeout(() => { 
    res.json({ 
     foo: "bar" 
    }); 
    }, API_DELAY); 
}); 

const argv = minimist(process.argv.slice(2)); 
const port = argv.port || 3000; 
console.log("Starting express on port", port); 
app.listen(port); 

Per gli ambienti di integrazione continui, è possibile installare i server di node_modules finte senza cambiare le directory in questo modo:

npm --prefix ./mock-server install ./mock-server