2015-09-21 10 views
20

Cho rằng tôi có hai lớp ES6.Làm thế nào để mô phỏng các lớp phụ thuộc để thử nghiệm đơn vị với mocha.js?

Đây là class A:

import B from 'B'; 

class A { 
    someFunction(){ 
     var dependency = new B(); 
     dependency.doSomething(); 
    } 
} 

Và lớp B:

class B{ 
    doSomething(){ 
     // does something 
    } 
} 

tôi kiểm tra đơn vị sử dụng mocha (với babel cho ES6), chai và Sinon, hoạt động thực sự tuyệt vời. Nhưng làm thế nào tôi có thể cung cấp một lớp giả cho lớp B khi kiểm tra lớp A?

Tôi muốn thử toàn bộ lớp B (hoặc hàm cần thiết, không thực sự quan trọng) để lớp A không thực thi mã thực nhưng tôi có thể cung cấp chức năng kiểm tra.

Đây là, những gì các thử nghiệm mocha trông giống như bây giờ:

var A = require('path/to/A.js'); 

describe("Class A",() => { 

    var InstanceOfA; 

    beforeEach(() => { 
     InstanceOfA = new A(); 
    }); 

    it('should call B',() => { 
     InstanceOfA.someFunction(); 
     // How to test A.someFunction() without relying on B??? 
    }); 
}); 
+0

đọc về [DI] (https://en.wikipedia.org/wiki/Dependency_injection) – Mritunjay

Trả lời

20

Bạn có thể sử dụng để tạo ra một SinonJS stub để ngăn chặn chức năng thực sự được thực thi.

Ví dụ, với lớp A:

import B from './b'; 

class A { 
    someFunction(){ 
     var dependency = new B(); 
     return dependency.doSomething(); 
    } 
} 

export default A; 

Và lớp B:

class B { 
    doSomething(){ 
     return 'real'; 
    } 
} 

export default B; 

thử nghiệm này có thể trông giống như:

describe("Class A",() => { 

    var InstanceOfA; 

    beforeEach(() => { 
     InstanceOfA = new A(); 
    }); 

    it('should call B',() => { 
     sinon.stub(B.prototype, 'doSomething',() => 'mock'); 
     let res = InstanceOfA.someFunction(); 

     sinon.assert.calledOnce(B.prototype.doSomething); 
     res.should.equal('mock'); 
    }); 
}); 

Sau đó bạn có thể khôi phục lại chức năng nếu cần thiết sử dụng object.method.restore();:

var stub = sinon.stub (đối tượng, "phương pháp");
Thay thế đối tượng.method bằng hàm số . Bạn có thể khôi phục chức năng ban đầu bằng cách gọi object.method.restore(); (hoặc stub.restore();). Một ngoại lệ được ném nếu thuộc tính không phải là một chức năng, để giúp tránh lỗi chính tả khi phương pháp xâu chuỗi.

+0

Woa. Thật dễ dàng. Không nghĩ đến việc thay đổi nguyên mẫu. Cảm ơn! :) Bạn có mẹo về cách giả lập hàm tạo không? Có vẻ như không làm việc theo cùng một cách? – mvmoay

+1

Kiểm tra câu trả lời này Tôi đã đưa ra một vài ngày trước http://stackoverflow.com/questions/32550115/mocking-javascript-constructor-with-sinon-js/32551410#32551410 – victorkohl

+0

Bạn sẽ làm điều này như thế nào cho hàm tạo của B? – Willwsharp

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