javascript - Karma ve typescript kullanarak RequireJS modülleri düzgün yüklemiyor
Bir SPA için karma/jasmine kullanarak birim testi kurmaya çalışıyorum
Her şeyden önce, aşağıdaki test karma'da sorunsuz çalışıyor:
/// <reference path="../../definitions/jasmine/jasmine.d.ts" />
/// <reference path="../../src/app/domain/core/Collections.ts"/>
define(["app/domain/core/Collections"], (collections) => {
describe('LinkedList', () => {
it('should be able to store strings for lookup', () => {
var list = new collections.Collections.LinkedList<string>();
list.add("item1");
expect(list.first()).toBe("item1");
});
});
});
Ancak, collections tipi any olduğu için bunu tür bildirimleri için kullanamıyorum, bu yüzden testlerimi yazarken intellisense ve benzeri özelliklerden mahrumum. Hiç iyi değil!
Sorun, testi daha TypeScript dostu bir biçime yeniden yazmaya çalıştığımda ortaya çıkıyor:
/// <reference path="../../definitions/jasmine/jasmine.d.ts" />
/// <reference path="../../src/app/domain/core/Collections.ts"/>
import c = require("./../../src/app/domain/core/Collections");
describe('LinkedList', () => {
it('should be able to store strings for lookup', () => {
var list: c.Collections.LinkedList<string> = new c.Collections.LinkedList<string>();
list.add("item1");
expect(list.first()).toBe("item1");
});
});
Bu gayet güzel derleniyor, elime pratik IntelliSense vb. için tip bilgim geliyor, ama şimdi karma bir hata veriyor.
Görünüşe göre, aşağıdaki hata mesajlarıyla belirtilen şekilde, modülü .js son eki olmadan yüklemeye çalışıyor:
There is no timestamp for /base/src/app/domain/core/Collections!
Failed to load resource: the server responded with a status of 404 (Not Found)
(http://localhost:9876/base/src/app/domain/core/Collections)
Uncaught Error: Script error for: /base/src/app/domain/core/Collections
Şimdilik burada duracağım, ama yardımcı olacaksa karma yapılandırma dosyamı, test-main ve benzerlerini seve seve sağlayabilirim. Ama umudum şu ki, birisi bu tam sorunu daha önce yaşamıştır ve beni doğru yönlendirebilir.
TypeScript'im AMD bayrağı ile derleniyor.
Cevap #1
Bu bir TypeScript sorunu değil. Aynı sorunla karşılaştık. Görünüşe göre karma "window.__karma__.files" dizisi, teste dahil edilen tüm dosyaları, .js uzantısı dahil olmak üzere içeriyor.
Artık requireJS, .js uzantısı sağlandığında çalışmıyor. Bunu düzeltmek için, main-test.js dosyamızda, tüm *Spec.js dosyalarını filtreleyerek bir "tests" değişkeni oluşturduk ve ardından dosya adından .js kısmını kaldırdık, çünkü requireJS'in bunu gerektirdiği şekilde olması gerekiyor. Daha fazla bilgi için: http://karma-runner.github.io/0.8/plus/RequireJS.html
Aşağıda bunu nasıl yaptığımız gösterilmektedir (yukarıdaki bağlantıda verilen bilgilere dayanılarak):
main-test.js
console.log('===========================================')
console.log('=================TEST FILES================')
var tests = Object.keys(window.__karma__.files).filter(function (file) {
return /\Spec\.js$/.test(file);
}).map(function (file) {
console.log(file);
return file.replace(/^\/base\/|\.js$/g, '');
});
console.log('===========================================')
console.log('===========================================')
require.config({
baseUrl:'/base',
paths: {
jquery :["http://ajax.googleapis.com/ajax/libs/jquery/1.10.0/jquery.min", "lib/jquery"],
angular : ["https://ajax.googleapis.com/ajax/libs/angularjs/1.3.0-beta.14/angular.min", "lib/angular"],
angularMocks: 'app/vendors/bower_components/angular-mocks/angular-mocks',
},
shim: {
'angularMocks': {
deps: ['angular'],
exports: 'angular.mock'
}
},
deps: tests,
callback: window.__karma__.start
});
Ayrıca, karma.config.js dosyanızda test edilecek dosyaları sağladığınızdan emin olun, daha fazla detay için buraya bakın: http://karma-runner.github.io/0.8/plus/RequireJS.html yukarıdaki bağlantı ile aynı.
Umarım yardımcı olur
Cevap #2
Görünüşe göre modülü .js ekini olmadan yüklemeye çalışıyor,
Bu belki de hatanın gerçek kaynağı değildir. Aslında /base/src/app/domain/core/Collections adresine bakıyor ve app/domain/core/Collections adresine değil (sizin elle yazdığınız tür güvensiz yöntem gibi). base/src/ kısmına dikkat edin, orada olmaması gerekiyor.
