2017-05-16 32 views
1

我正嘗試在自動測試中修改JavaScript文件中的網址。這樣我就可以指出一個服務的殘缺版本。我使用的測試框架是寧靜-JS(使用量角器)如何使用javascript自動測試更改javascript文件中的網址自動測試

在我的HTML DOM我有:

<script type="text/javascript" src="main.js"></script>

main.js

var DataService = (function() { 
    function DataService(http) { 
     this.http = http; 
    } 
    DataService.prototype.getStudentDetails = function (id) { 
     var parcel = this.http 
      .get('http://127.0.0.1/endpoint/' + id) 
      .map(function (res) { 
      return __WEBPACK_IMPORTED_MODULE_2__student_model__["a"].createStudent(res.json()); 
     }); 
     return student; 
    }; 
    return DataService; 
}()); 

我需要的部分變化是127.0.0.1/endpoint

我知道我用冷或$.document.write改變$().append的HTML DOM,但不硝酸鉀如何改變/覆蓋DOM元素。

+0

您可以使用JS變量或「輸入隱藏」字段。 – alok

+1

main.js文件是一個現有的生產系統。我寧願不更改它可能從其他用戶開放漏洞的源代碼。我寧願嘗試改變'即時'。 –

+0

啊!這就是你從哪裏來的!對不起,我完全誤解了。 – alok

回答

0

這很簡單,但有很多方法可以做到!

  1. 作爲運行測試之前設置階段的一部分,你可以只預處理使用sedawk腳本main.js文件,並用別的東西代替127...字符串的所有地方。
  2. 將生產系統中的代碼更改爲從包含所有url端點的配置變量讀取。然後,您可以在測試腳本中更改該對象。
  3. 使用您的測試腳本來替換其他功能。這是@alok暗示的評論,但評論失蹤prototype和方法也應該不會被調用,所以代碼應該是這個樣子:

的#3示例:

const newFnString = DataService.prototype.getStudentDetails.toString() 
         .replace("127.0.0.1", "something.com"); 
DataService.prototype.getStudentDetails = new Function(newFnString); 

當然,您可以用任何給定的函數代替DataService.prototype.getStudentDetails,因爲您可以完全控制它(除非它隱藏在閉包中)。

P.S.試圖通過使其更難以篡改JavaScript來保護您的系統只是通過默默無聞的安全性 - 這不是真實的。無論如何,任何攻擊者都可以只讀網絡請求,並在curl或Postman中重播。

+0

歡呼,工作 –

+0

@AndrewEvans很高興聽到。你選擇了三種方法中的哪一種? – oligofren