2013-07-10 26 views
13

Làm cách nào để tạo các thử nghiệm được kiểm tra với Mocha?các thử nghiệm được kiểm chứng với Mocha

Trường hợp sử dụng mẫu: Tôi có 10 lớp, 10 triển khai khác nhau của cùng một giao diện. Tôi muốn chạy chính xác cùng một bài kiểm tra cho mỗi lớp. Tôi có thể tạo một hàm, lấy lớp như một tham số và chạy tất cả các bài kiểm tra với lớp đó, nhưng sau đó tôi sẽ có tất cả các bài kiểm tra trong một hàm duy nhất - tôi sẽ không thể phân biệt chúng với các mệnh đề "mô tả" khác nhau. ..

Có cách nào tự nhiên để thực hiện việc này trong Mocha không?

+2

đây là một ví dụ điển hình mà không sử dụng async http://stackoverflow.com/questions/18166770/mocha-js-how-to-reuse-assertions-within-a-spec – artkoshelev

Trả lời

9

Hãy xem async.each. Nó sẽ cho phép bạn gọi cùng một mô tả, nó, và mong đợi/nên báo cáo, và bạn có thể vượt qua trong các tham số để đóng cửa.

var async = require('async') 
var expect = require('expect.js') 

async.each([1,2,3], function(itemNumber, callback) { 
    describe('Test # ' + itemNumber, function() { 
    it("should be a number", function (done) { 
     expect(itemNumber).to.be.a('number') 
     expect(itemNumber).to.be(itemNumber) 
     done() 
    }); 
    }); 
callback() 
}); 

mang lại cho tôi:

$ mocha test.js -R spec 
    Test # 1 
    ✓ should be a number 
    Test # 2 
    ✓ should be a number 
    Test # 3 
    ✓ should be a number 
    3 tests complete (19 ms) 

Dưới đây là một ví dụ phức tạp hơn kết hợp async.series và async.parallel: Node.js Mocha async test doesn't return from callbacks

+6

là nó thực sự cần thiết để sử dụng async, sẽ không array.every (vòng lặp foreach) làm tương tự mà không cần một công cụ của bên thứ ba khác? – Dukeatcoding

+0

'async' là một lib tuyệt vời, fav của tôi trong Node.js-land, nhưng gói Mocha mô tả các khối với các cuộc gọi không đồng bộ là sử dụng không đúng Mocha. Trước hết, các callback trong thư viện async nên luôn được gọi trong lần đánh dấu tiếp theo của vòng lặp sự kiện, luôn luôn. Thứ hai, Mocha đăng ký tất cả các khối và móc đồng bộ - nếu bạn đăng ký một khối không đồng bộ, không có gì đảm bảo rằng nó sẽ chạy. Xem chức năng trì hoãn trong Mocha: https://github.com/mochajs/mocha/issues/362 –

20

Bạn không cần async gói. Bạn có thể sử dụng vòng lặp forEach trực tiếp:

[1,2,3].forEach(function (itemNumber) { 
    describe("Test # " + itemNumber, function() { 
     it("should be a number", function (done) { 
      expect(itemNumber).to.be.a('number') 
      expect(itemNumber).to.be(itemNumber) 
     }); 
    }); 
}); 
+1

Với '[1,4] .forEach (function (itemNumber) {' Tôi đã nhận 'TypeError: Không thể gọi phương thức 'forEach' of undefined' – hellboy

+0

Tôi có nên luôn sử dụng 'mảng' thay vì' từ điển'? – hellboy

+0

@hellboy bạn có thể chia sẻ đoạn mã? –

5

Tôi biết điều này đã được đăng một lúc trước nhưng hiện tại có một mô-đun nút giúp việc này thực sự dễ dàng !! mocha param

const itParam = require('mocha-param').itParam; 
const myData = [{ name: 'rob', age: 23 }, { name: 'sally', age: 29 }]; 

describe('test with array of data',() => { 
    itParam("test each person object in the array", myData, (person) => { 
    expect(person.age).to.be.greaterThan(20); 
    }) 
}) 
Các vấn đề liên quan