Tôi đang chuẩn bị viết một số bài kiểm tra với Qunit cho ứng dụng Backbone được viết cho ES6 với babel.js áp dụng cho nó để nó có thể chạy trong trình duyệt hiện đại. Để đảm bảo rằng tôi đã thiết lập qunit đúng và tất cả các đường dẫn được chỉ định đúng, trước tiên tôi đã thử nghiệm một mô hình Backbone được viết bằng ES5 và mọi thứ hoạt động như mong đợi. Tuy nhiên, tôi sau đó bao gồm bundle.js
(trong đó có kết quả của mã ES6 tôi với babel.js áp dụng cho nó) vào tests/index.html
của tôi, và đã viếtmã thử nghiệm được chuyển cho es6
test ("Code transformed by babel.js contained in bundle.js can be tested", function(){
expect(1);
var es6model = new ES6Model();
equal(es6model.get("defaultproperty"), "defaultstring", "defaultproperty should be defaultstring");
})
và nó nói với tôi ES6Model
không được định nghĩa.
Câu hỏi: có điều gì đó về mã được chuyển bởi babeljs có thể làm cho việc kiểm tra bằng Qunit trở nên khó khăn hơn?
Ngoài tất cả các js phức tạp mà babel viết ở phía trên cùng của tập tin, mã trong bundle.js
trông như thế này
var Model = Backbone.Model;
var View = Backbone.View;
var Collection = Backbone.Collection;
var Router = Backbone.Router;
var LocalStorage = Backbone.LocalStorage;
var ES6Model = (function (Model) {
function ES6Model() {
_classCallCheck(this, ES6Model);
if (Model != null) {
Model.apply(this, arguments);
}
}
_inherits(ES6Model, Model);
_prototypeProperties(Gopher, null, {
defaults: {
value: function defaults() {
return {
defaultproperty: "defaultstring"
};
},
writable: true,
configurable: true
}
});
return ES6Model;
})(Model);
Cập nhật
tôi bao gồm tất cả các mã được tạo ra bởi babel.js trong một tệp có tên là bundle.js
và bao gồm trong index.html của tôi giống như tôi sẽ làm bất kỳ tệp js nào khác và nó chạy mà không có vấn đề, đó là lý do tại sao tôi cho rằng tôi có thể kiểm tra nó giống như bất kỳ mã js nào khác. Tuy nhiên, cần lưu ý (như người bình luận đã chỉ ra) rằng mã được tạo bởi babel.js được chứa trong mô-đun..đây là cách bundle.js bắt đầu bằng mô hình tôi đang cố gắng kiểm tra sau
(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
"use strict";
Cập nhật
Tôi đang sử dụng browserify để áp dụng babel cho các tệp khác nhau của mã ES6 tạo một gói. Để chạy các bài kiểm tra, tôi làm npm run test
và biên dịch các bó, tôi thử cả hai trong số này (một trong số họ sử dụng modules --ignore
) nhưng không ai trong số họ làm việc
"kịch bản": {
"test": "./node_modules/karma/bin/karma start --log-level debug",
"build-js": "browserify app/app.js app/views.js app/models.js app/d3charts.js -t babelify > app/bundle.js",
"t-build": "browserify app/app.js app/views.js app/models.js app/d3charts.js -t [babelify --modules ignore] > app/test/test-bundle.js"
},
(Ứng dụng là một ứng dụng Backbone.js).
Đây là tệp cấu hình nghiệp của tôi. Tôi không có bất kỳ cấu hình thêm (vì vậy tôi đoán bao gồm của tôi về nghiệp-yêu cầu là một sự lãng phí nhưng có lẽ cần thiết ...)
module.exports = function(config) {
config.set({
basePath: '',
frameworks: ['qunit'],
plugins: ['karma-qunit', 'karma-phantomjs-launcher', 'karma-requirejs'],
files : [
'app/test/jquery.js',
'app/test/d3.js',
'app/test/json2.js',
'app/test/underscore.js',
'app/test/backbone.js',
'app/backbone.localStorage.js',
'app/test/test-bundle.js',
'app/test/tests.js'
],
reporters: ['progress'],
// web server port
port: 8080,
// enable/disable colors in the output (reporters and logs)
colors: true,
// level of logging
// possible values: config.LOG_DISABLE || config.LOG_ERROR || config.LOG_WARN || config.LOG_INFO || config.LOG_DEBUG
logLevel: config.LOG_INFO,
// enable/disable watching file and executing tests whenever any file changes
autoWatch: false,
// start these browsers
// available browser launchers: https://npmjs.org/browse/keyword/karma-launcher
browsers: ['PhantomJS'],
// Continuous Integration mode
// if true, Karma captures browsers, runs the tests and exits
singleRun: true,
// See http://stackoverflow.com/a/27873086/1517919
customLaunchers: {
Chrome_sandbox: {
base: 'Chrome',
flags: ['--no-sandbox']
}
}
});
};
Có lẽ "tất cả các js phức tạp ở đầu tệp" sẽ thiết lập phạm vi mô-đun trong đó 'ES6Model' được chứa. Làm thế nào để bạn bao gồm và gọi nó trong một trang bình thường, không làm việc đó? – Bergi
@Bergi lol. Tôi bao gồm tất cả mã được tạo bởi babel.js trong một tệp có tên bundle.js và bao gồm giống như bất kỳ tệp js nào khác và nó chạy mà không có vấn đề, đó là lý do tại sao tôi cho rằng sẽ không có bất kỳ vấn đề nào kiểm tra nó như bình thường js. Nhưng có, bạn là đúng, nó dường như tạo ra một phạm vi mô-đun như 'bundle.js' bắt đầu như thế này' (function e (t, n, r) {function s (o, u) {if (! N [o ]) ... ' – BrainLikeADullPencil