2017-12-11 114 views
11

Hãy nói rằng bạn có một bài kiểm tra mocha đơn giản:Có cách nào để có được ví dụ Mocha hiện tại và các tùy chọn chỉnh sửa khi chạy không?

describe("Suite", function(){ 
    it("test",function(doneCallback){ 
     // here be tests 
    }); 
}); 

Trong thử nghiệm này, tôi có thể thay đổi thời gian chờ bằng cách thêm this.timeout(VALUE); bất cứ nơi nào trong describe chức năng.

Tuy nhiên, bên cạnh những giá trị timeout, có rất nhiều Mocha options khác có thể được độc quyền công bố hoặc từ dòng lệnh hoặc từ một tập tin mocha.opts sống trong thư mục test (./test/mocha.opts).

Điều tôi muốn là thay đổi một số tùy chọn này trong thời gian chạy (ví dụ: reporter) và không ở dòng lệnh/mocha.opts tệp. Từ nghiên cứu của tôi về những gì có thể, tôi thấy rằng có an article explaining how you can use mocha programmatically, điều này sẽ cho phép thay đổi các tùy chọn này trong thời gian chạy, nhưng bạn cần tự tạo ví dụ Mocha, trong khi thử nghiệm thông thường không trực tiếp truy cập vào phiên bản Mocha.

Vì vậy, có cách nào để lấy ví dụ Mocha từ thử nghiệm hiện có và thay đổi một số tùy chọn này như reporter vào thời gian chạy trong khi thử nghiệm không?

Tôi muốn có một lựa chọn mà không cần thay đổi mã nguồn của Mocha dưới mọi hình thức (Tôi cho rằng tôi có thể làm xáo trộn các Mocha dụ để thực hiện một cách để có được một thể hiện trực tiếp trong các nhà xây dựng Mocha) .

+0

Có vẻ như bạn muốn theo dõi bài viết mà bạn tự tạo một bản sao mocha. – kevzettler

+0

@kevzettler Bài viết nào? Tôi liên kết với ai? Điều đó đòi hỏi bạn phải tạo ra 'Mocha' instance và' Mocha' runner (thêm các tập tin kiểm tra vv), trong khi tôi muốn sử dụng từ dòng lệnh 'mocha myTest.js' và có' myTest.js' hook đến 'Mocha 'instance và có thể sửa đổi các tùy chọn trong thời gian chạy – Adelin

+0

có, https://github.com/mochajs/mocha/wiki/Using-mocha-programmatically article. – kevzettler

Trả lời

2

Không, bạn không thể. mà không thay đổi mã.

Tóm lại, mocha được tạo trong phạm vi bạn không thể truy cập từ các thử nghiệm.Nếu không đi vào chi tiết, các đối tượng được cung cấp trong phạm vi của bạn không thể thay đổi các tùy chọn bạn muốn. (Bạn không thể làm điều này: link)

Nhưng có một cách để xác định riêng bạn phóng và tùy chỉnh đầu ra cho mỗi bài kiểm tra:

Tạo một tập tin gọi MyCustomReporter.js:

'use strict'; 

module.exports = MyCustomReporter; 

function MyCustomReporter (runner) { 

    runner.on('start', function() { 
     var reporter = this.suite.suites["0"].reporter; 
     process.stdout.write('\n'); 

    }); 

    runner.on('pending', function() { 
      process.stdout.write('\n '); 
    }); 

    runner.on('pass', function (test) { 
     var reporter = this.suite.useReporter; 
     if(reporter == 'do this') { 
     } 
     else if(reporter == 'do that'){ 
     } 
     process.stdout.write('\n '); 
     process.stdout.write('passed'); 
    }); 

    runner.on('fail', function() { 
     var reporter = this.suite.useReporter; 
     process.stdout.write('\n '); 
     process.stdout.write('failed '); 
    }); 

    runner.on('end', function() { 
     console.log(); 
    }); 
} 

Khi bạn chạy mocha, vượt qua con đường của MyCustomReporter.js như tham số phóng viên (không .js), ví dụ:

mocha --reporter "/home/user/path/to/MyCustomReporter" 

Giá trị mặc định mocha kịch bản thực sự cố gắng để yêu cầu một tập tin phóng viên nếu nó không được tìm thấy trong những mặc định (dưới lib/phóng), github link

Cuối cùng, trong các thử nghiệm của bạn, bạn có thể vượt qua một số thông số để tùy chỉnh đầu ra của người báo cáo của bạn:

var assert = require('assert'); 
describe('Array', function() { 
    describe('#indexOf()', function() { 
     this.parent.reporter = 'do this'; 
    it('should return -1 when the value is not present', function() { 
     this.runnable().parent.useReporter = 'do this'; 
     assert.equal([1,2,3].indexOf(4), -1); 
    }); 
    }); 
}); 
+0

Tôi chấp nhận câu trả lời cho thực tế là thực sự, bạn không thể lấy được cá thể từ một ngữ cảnh khác và thực tế là [liên kết mà bạn đã tham chiếu] (https://stackoverflow.com/questions/1789892/access-parent-object -in-javascript) là một tài nguyên tốt để tôi hiểu rõ hơn về điều đó. Tuy nhiên, phần mà bạn giải thích làm thế nào để tạo ra một phóng viên tùy chỉnh, với tôi, là rambling. Tôi đã có một và tôi muốn chuyển từ một phóng viên mặc định ('list') thành một phóng viên tùy chỉnh, tại thời gian chạy. – Adelin

2

Cách tốt nhất để bạn có thể đạt được điều đó là sử dụng Mocha theo liên kết wiki mà bạn đã tham chiếu, đang sử dụng Mocha theo lập trình.

Vì vậy, yêu cầu của bạn về việc thay đổi reporter tham số ở đây là một ví dụ ngắn gọn mà có thể làm những gì bạn muốn, để chạy thử nghiệm chống lại một tập tin trên lý thuyết đã tồn tại tên test-file-a.js có chứa các bài kiểm tra của bạn:

var Mocha = require('mocha'), 
    mocha = new Mocha(), 
    path = require('path'); 

mocha.addFile(path.join(__dirname, 'test-file-a.js')); 

mocha 
    .reporter('list') 
    .run(); 

Bên cạnh đó có rất nhiều lựa chọn khác mà bạn có thể sử dụng và cũng có một số người nghe cho các sự kiện, như test mà bạn có thể muốn làm điều gì đó trong một bài kiểm tra, ví dụ:

mocha 
    .reporter('list') 
    .ui('tdd') 
    .bail() 
    .timeout(10000) 
    .run()  
    .on('test', function(test) { 
     if (test.title === 'some title that you want here') { 
      //do something 
     } 
    }); 

Xin lưu ý rằng bạn có thể xác định các tùy chọn cho mỗi cá thể Mocha sẽ chạy lại bộ kiểm thử, nhưng không trong thời gian chạy của bộ thử nghiệm, ví dụ: nếu bạn bắt đầu thử nghiệm test-file-a.js với tùy chọn reporter('list') như trên không thể thay đổi nó trong khi các thử nghiệm đang chạy đến một thứ khác, như bạn có thể làm ví dụ với tùy chọn timeout nơi bạn có thể làm this.timeout().

Vì vậy, bạn sẽ phải tạo một ví dụ Mocha mới dưới dạng ví dụ ở trên với các tùy chọn khác nhau mỗi lần.

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