2013-10-19 225 views
11

我正在使用量角器为我的Angular应用程序编写端到端测试。我可以模拟httpBackend进行单元测试,但我想实际调用服务器并返回JSON响应,并再次将测试结果写回测试数据。
我已阅读了很多关于stackoverflow,但无法理解这是如何完成的。角度量角器e2e测试

我使用$ http?我如何将它注入我的茉莉花测试?我如何将回复JSON回到我的Jasmine测试中?

任何帮助或链接资源与指示做这将是有益的。

我又不想嘲笑到服务器,我想打服务器,并获得JSON回来。

谢谢!

回答

3

量角器应该用于完整堆栈的端到端测试。

在这种情况下,测试通常会执行角度应用程序(填充表单,按下按钮),这将会触发角度应用程序调用REST服务器,该服务器会返回数据,Angular应用程序会在DOM更改中转换数据,端到端测试断言。

这意味着你可能要开始量角器

如何做到这一点之前,启动应用程序服务器(它承载角应用是REST后台,我想)超出范围的量角器。

在这个困难通常是如何设置你的数据库,从而使端对端测试知道要期待的回报您的JSON的服务内容。

5

我现在正在通过这个工作。我认为简短的回答是,您将自己的应用程序设置为与自己手动测试应用程序完全相同 - 因此,量角器实际上只是一个机器人用户,它没有(很好,几乎没有)访问应用程序的内部。

所以,如果你的应用需要一个Web服务器(以及大多数人),那么你就启动该Web服务器,然后让量角器通过浏览器连接到您的应用程序并执行它。

对于我而言,我的目标使用咕噜叫,做基本的数据库建立一个任务就开始运行我的量角器端对端测试之前 - 这应该给我一个已知的数据库状态。

对于这样的一个例子,我已经写教程使用与AngularJS轨道4,使用量角器的端对端测试部分不轨特定的,可能是有用的: http://technpol.wordpress.com/2013/11/16/5-end-to-end-testing/

0

下面是仅当e2e测试运行时如何自动启动和停止单独的节点服务器的示例。包含一个简单的快速模拟服务器脚本作为示例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; 
    } 
}; 

模拟服务器/索引。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); 

持续集成环境中,你可以安装模拟服务器node_modules不改变目录是这样的:

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