2016-08-26 63 views
2

如我們所知,在配置文件中使用RequireJS時,我們必須定義'路徑'和'填充'。在編寫測試(Karma,Jasmine)時,我們需要爲RequireJS創建一個額外的配置文件並重新定義相同的數據。將包含來自AngularJS應用程序的模塊的文件包含到Karma的RequireJS配置文件中

我嘗試提取公共部分並動態加載它們。在Angular JS應用程序中,一切都沒有問題,但在測試中,我總是出現錯誤'404'。但讓我們開始吧。簡單示例結構:

. 
|-- newApp 
| |-- app 
| | `-- app.require.js 
| |-- newApp.require.js 
| `-- index.html 
`-- test 
    |-- test.karma.js 
    `-- test.require.js 

的index.html負載RequireJS配置文件

<script data-main="newApp.require.js" src="bower_components/requirejs/require.js"></script> 

newApp.require.js初始化RequireJS

require([ 
    'app/app.require' 
], function (appRequire) { 
    "use strict"; 

    require.config({ 
     baseUrl: 'app', 
     paths: appRequire.paths, 
     shim: appRequire.shim, 
     deps: [ 
      'NewAppBootstrap' 
     ] 
    }); 
}); 

app.require.js帶路徑和墊片的模塊/對象

define([ 
    'some/others/components.require' 
], function (componentsRequire) { 
    "use strict"; 

    var appRequire = { 
     'NewApp': 'app.module', 
     'NewAppBootstrap': 'app.bootstrap', 
     'NewAppRoute': 'app.routes' 
    }; 

    var vendorRequire = { 
     'jQuery': { 
      exports: '$' 
     }, 
     'angular': { 
      exports: 'angular' 
     } 
    }; 

    return { 
     paths: Object.assign(
      appRequire, 
      componentsRequire 
     ), 
     shim: vendorRequire 
    }; 
}); 

到目前爲止一切正常。現在我想將app.require.js加載到test.require.js。而問題開始......

test.require.js

var TEST_REGEXP = /(spec|test)\.js$/i; 
var allTestFiles = []; 

Object.keys(window.__karma__.files).forEach(function (file) { 
    'use strict'; 

    if (TEST_REGEXP.test(file)) { 
     var normalizedTestModule = file.replace(/^\/base\/|\.js$/g, ''); 
     allTestFiles.push(normalizedTestModule); 
    } 
}); 

require([ 
    'app/app.require' 
], function (appRequire) { 
    "use strict"; 

    require.config({ 
     baseUrl: '/base/newApp', 
     waitSeconds: 200, 
     paths: appRequire.paths, 
     shim: appRequire.shim, 
     deps: allTestFiles, 
     callback: window.__karma__.start 
    }); 
}); 

不幸的是,我仍然有錯誤:

WARN [web-server]: 404: /app/app.require.js 
PhantomJS 2.1.1 (Linux 0.0.0) ERROR: 'There is no timestamp for app/app.require.js!' 

PhantomJS 2.1.1 (Linux 0.0.0) ERROR 
    Error: Script error for "app/app.require" 
    http://requirejs.org/docs/errors.html#scripterror at node_modules/requirejs/require.js:143 

我嘗試了不同的路徑,但仍然一無所獲。有誰知道如何加載這個文件?在這個地方是否有可能加載文件?我會很感激任何提示。

+0

你試圖改變的路徑:'。 。/ newApp/app/app.require' – Andonaeus

+0

當然,我也嘗試過:app.require,app/app.require,newApp/app/app.require,../newApp/app/app.application.require。即使與/基地,但錯誤仍然是一樣的...... – FpDev

+0

也許這裏的答案可以有所幫助? http://stackoverflow.com/questions/20733090/karma-error-there-is-no-timestamp-for – Andonaeus

回答

1

到時候你的代碼打這個require電話:

require([ 
    'app/app.require' 
], 

有沒有有效RequireJS配置,並且不使用data-main,所以默認RequireJS需要包含加載RequireJS的HTML頁面的目錄作爲baseUrl(請參閱the documentation。)由於index.html位於根目錄,因此RequireJS會將您的模塊名稱解析爲/app/app.require.js,但找不到它。

您可以通過使用一個完整路徑解決它:

require([ 
    'base/newApp/app/app.require' 
], 

或者,如果恰巧其他的代碼後會嘗試訪問此相同的模塊app/app.require,那麼你應該有一個最低配置你的第一個require調用之前:

require.config({ 
    baseUrl: '/base/newApp', 
}); 

這是完全正常的調用require.config多次。隨後的調用將覆蓋原子值(如baseUrl)和可以合併的marge值。 (後者的一個例子是paths。如果第一次調用設置一個paths爲模塊foo和第二個呼叫設置爲模塊bar一個paths,然後將得到的配置將有paths兩個foobar

相關問題