Trước tiên, tôi muốn thay đổi định nghĩa lớp học của bạn một chút (tên lớp chữ hoa và sửa chữa db phân công):
var Wrapper = (function() {
function Wrapper() {
this.db = require("database");
}
Wrapper.prototype.insertUser = function(doc) {
return this.db.query("INSERT INTO USERS...");
};
return Wrapper;
})();
Để còn sơ khai cả lớp:
var WrapperStub = sinon.spy(function() {
return sinon.createStubInstance(Wrapper);
});
sinon.createStubInstance
sẽ tạo ra một thể hiện của Wrapper, nơi mọi phương thức đều là sơ khai. sinon.spy
sẽ cho phép chúng tôi theo dõi lớp học.
Vì vậy, bạn có thể thực hiện nó như thế này:
// verify instantiation
var wrapper = new WrapperStub();
expect(WrapperStub).to.have.been.calledWithNew;
// verify method stub
wrapper.insertUser.returns('data');
expect(wrapper.insertUser()).to.equal('data');
expect(wrapper.insertUser).to.have.been.calledOnce;
(khẳng định sử dụng chai và sinon-chai)
tôi đã nói chỉ là "tập thể dục nó" vì đoạn mã này không phải là một bài kiểm tra đơn vị thực tế. Các cuộc gọi và các cuộc gọi phương thức sẽ được thực hiện bởi chủ thể của bạn đang được kiểm tra.
Bây giờ, nếu bạn muốn thử một sự phụ thuộc tiêm bởi require() -such như db = require('database')
trong example- của bạn, bạn có thể thử một công cụ kiểm tra như một trong hai Jest (nhưng không sử dụng Sinon) hoặc sinonquire mà tôi tạo ra cảm hứng của Jest nhưng để sử dụng nó với sinon cộng với công cụ kiểm tra yêu thích của bạn (mỏ là mocha). Bên trong, sinonquire sử dụng cùng một kỹ thuật được hiển thị ở trên kết hợp sinon.spy
và sinon.createStubInstance
để phân phát một lớp.
Nguồn
2015-10-28 04:53:37
Ồ. Vì vậy, tốt hơn là nên sử dụng phương thức 'insertUser' thay vì lệnh' this.db' mà 'insertUser' thực hiện? – Industrial
Phụ thuộc vào những gì bạn đang thử nghiệm, nhưng nếu bạn muốn kiểm tra xem trình chèn thêm có đang chèn vào DB mà sẽ là một phép thử tích hợp và không bị lúng túng sẽ giúp bạn tiết kiệm từ việc sử dụng logic thực với một số trong bộ nhớ DB. ví dụ, nếu bạn muốn kiểm tra nếu trình insertUser được gọi khi cần thì phương thức insertUser có thể là một cách để làm ... –