2013-12-09 17 views
12

Tôi gặp khó khăn khi kết nối Mocha với ứng dụng dựa trên RequireJS, có thể Bạn sẽ có thể tìm ra một thứ gì đó :). Sau nhiều giờ khi tôi cố gắng tải các mô-đun AMD và chỉ cần console.log một số thông tin 'đã kích hoạt' mà mô-đun đã được tải ... không có gì xảy ra - chương trình vừa kết thúc và in ra một số thông tin mocha.Mocha + RequireJS = Thử nghiệm AMD

var facade = requirejs(['../../public/js/scripts/widgets/widgets/article/main.js'],  
    function(mod) { 
     console.log('fired') 
}); 
// run with: $ mocha -u tdd test.js --reporter spec 

và hơn tôi đã đi lên với những ý tưởng để bắn chỉ này để kiểm tra callbacks:

setTimeout((function() { 
    console.log('fired'); 
}), 5000); 
// run with: $ mocha -u tdd test.js --reporter spec 

cũng đã không làm việc. Vì vậy, cuối cùng tôi đã chạy cả hai với

$ node test.js 

và cuối cùng hoạt động. Vì vậy, câu hỏi là hơn: Làm thế nào để chạy thử nghiệm Mocha với callbacks xử lý, vì đó là những điều cần thiết cho thử nghiệm AMD?

Trả lời

23

Cách bạn đang làm, mocha sẽ không làm bất kỳ điều gì với tệp của bạn vì nó không thấy bộ thử nghiệm trong đó. RequireJS được lên lịch để gọi lại callback nhưng mocha thoát trước khi điều này xảy ra. Cùng với ví dụ thời gian chờ của bạn.

Phần sau đây cung cấp cho bạn một ví dụ.

file test.js:

'use strict'; 
var requirejs = require("requirejs"); 
requirejs.config({ 
    baseUrl: '.', 
    nodeRequire: require 
}); 

suite('Something', function(){ 
    var foo; 

    suiteSetup(function (done){ 
     // This saves the module foo for use in tests. You have to use 
     // the done callback because this is asynchronous. 
     requirejs(['foo'], 
        function(mod) { 
      console.log("fired!"); 
      foo = mod; 
      done(); 
     }); 
    }); 

    suite('blah', function(){ 
    test('blah', function(){ 
     if (foo.test !== "test") 
      throw new Error("failed!"); 
    }); 
    }); 
}); 

file foo.js:

define(function() { 
    return {test: "test"}; 
}); 

Khi bạn chạy:

mocha -u tdd test.js 

Bạn sẽ thấy rằng khi gọi lại là bắn và thử nghiệm đi.

Vì lợi ích của những người đọc câu hỏi này và bị nhầm lẫn bởi việc sử dụng suite, suiteSetup, test ... Mocha hỗ trợ nhiều giao diện. Mã ở đây sử dụng giao diện TDD (OP gọi Mocha với -u tdd), xuất suite, suiteSetup, test, v.v. Trong giao diện BDD mặc định, tương đương là describe, beforeit.

+1

Có! Tôi đoán phương pháp 'done()' này là câu đố còn thiếu :). –

+0

Không chỉ '' done'', xem đoạn tôi đã thêm vào phần đầu của câu trả lời. Mocha không thấy bộ thử nghiệm trong tệp và đã thoát ngay lập tức. – Louis

+0

Có, ofcourse, Ur phải. –

3

Tôi đã định cấu hình bản mẫu liên quan để sử dụng mocha trong môi trường của RequireJS. Nó có thể không chính xác những gì bạn muốn, nhưng nó có thể hữu ích. https://github.com/x2es/boilerplate-karma-mocha-chai-requirejs

Một lưu ý khác - giả sử rằng tập lệnh của bạn được đặt trong "/ công khai", bạn nên kiểm tra nó trong môi trường trình duyệt thay vì nodejs. Vì mục đích này, bạn nên xem xét một số Á hậu thử nghiệm như JsTestDriver (https://code.google.com/p/js-test-driver/) hoặc nghiệp cử nhân (http://karma-runner.github.io/). Hay cách khác...

Trong snipped cung cấp trong tài liệu hướng dẫn nghiệp (http://karma-runner.github.io/0.8/plus/RequireJS.html)

var tests = []; 
for (var file in window.__karma__.files) { 
    if (window.__karma__.files.hasOwnProperty(file)) { 
    if (/Spec\.js$/.test(file)) { 
     tests.push(file); 
    } 
    } 
} 

requirejs.config({ 
    // Karma serves files from '/base' 
    baseUrl: '/base/src', 

    paths: { 
     'jquery': '../lib/jquery', 
     'underscore': '../lib/underscore', 
    }, 

    shim: { 
     'underscore': { 
      exports: '_' 
     } 
    }, 

    // ask Require.js to load these files (all our tests) 
    deps: tests, 

    // start test run, once Require.js is done 
    callback: window.__karma__.start 
}); 

giới thiệu cách khi chúng ta buộc requirejs để tải trước tất cả spec file cần thiết sử dụng

require.config({ 
    deps: ['array', 'of', 'our', 'spec', 'files'] 
}) 

Trong môi trường này, mỗi spec tập tin nên được một mô-đun RequireJS thông thường.

Ví dụ về kiểm tra spec cho môi trường như vậy:

define(['chai'], function(chai) { 
    var expect = chai.expect; 

    describe('bootstrap', function() { 
    it('should...', function() { 
     expect('a').to.equal('a'); 
    }); 
    }); 
}); 
+0

Tôi nghĩ rằng giải pháp này cũng ok nhưng nó sử dụng 'chai' và tôi muốn xử lý nó mà không có 'lời hứa' cho bây giờ. Nhưng cảm ơn bạn vì những nỗ lực :). –

Các vấn đề liên quan