2016-01-05 30 views
3

我正在为nightwatch.js的单页应用程序编写e2e测试。如何使用nightwatch.js和sinon.js来模拟API响应?

我有一些API请求,如验证。所以我想用sinon.js的fakeServer来模拟响应数据。这是我的代码。

import sinon from 'sinon'; 

const WAIT_TIME = 5000; 
const host = 'http://localhost:3000/#/'; 
const uri = new RegExp(escape('/users/login')); 

module.exports = { 
    'Login Test': function(browser) { 
    let server; 

    browser 
     .windowSize('basicTest', 1440, 710) 
     .url(host + 'account/login') 
     .waitForElementVisible('body', WAIT_TIME) 
     .setValue('input[type=email]', '[email protected]') 
     .setValue('input[type=password]', 'password') 
     .execute(function() { 
     server = sinon.fakeServer.create(); 
     server.respondWith('POST', uri, [ 
      200, { 'Content-Type': 'application/json' }, JSON.stringify(someResponseData), 
     ]); 
     }) 
     .submitForm('form') 
     .execute(function() { 
     server.respond(); 
     }) 
     .waitForElementNotPresent('input.[type=submit]', WAIT_TIME) // the page should be redirected to another page 
     .execute(function() { 
     server.restore(); 
     server = null; 
     }) 
     .end(); 
    }, 
}; 

我不能模拟响应,并得到了下面的错误(当API服务正在运行,有没有错误,但反应不会被嘲笑一个)。

Error: Origin is not allowed by Access-Control-Allow-Origin 

我想知道,首先,使用sinon.js的fakeServer是否正确?这是可能的e2e(和nightwatch.js)?

请给我一个帮助。

+0

我已经决定要使用的RESTify ... https://github.com/restify/node-restify – okmttdhr

回答

2

要回答你的问题,我首先需要解释你收到的错误的性质。

这是一个CORS(跨源资源共享)错误。

基本上,单页应用程序背后的一些服务知道不允许来自您的应用程序的请求。返回该错误的服务(我无法分辨您发布的信息是什么)会检测到来自而不是您的应用的请求,并拒绝该请求。

您可以禁用服务的CORS安全性(我强烈建议您不要这样做),或者您可以尝试更改请求的源标头。这很棘手,因为大多数现代浏览器专门为了保护用户而阻止这种改变。由于您使用的是Nightwatch,因此您的环境通常是浏览器的环境。

根据此错误您必须已经错误地设置了服务器,因为它看起来好像您的请求仍然是实际的API而不是嘲笑的服务器

可能因为你提交表单时,浏览器仍然会提交表单到它应该去的地方(而不是你的模拟服务器),除非有其他的说法。看着你的代码,你正在建立一个模拟服务器,但是单单从这个文件来看,并不清楚浏览器应该知道如何向请求模拟服务器发送请求。

一个替代的解决方案见nock,我即将开始使用它:)

+1

为了谁downvoted请随时审查这个答案,我意识到它措辞不佳,现在应该清楚。 – GrayedFox

相关问题