2016-01-05 28 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

相關問題