2015-09-13 12 views
20

Tôi muốn đơn vị kiểm tra lớp ES6 sau:Mocking Javascript constructor với Sinon.JS

// service.js 
const InternalService = require('internal-service'); 

class Service { 
    constructor(args) { 
    this.internalService = new InternalService(args); 
    } 

    getData(args) { 
    let events = this.internalService.getEvents(args); 
    let data = getDataFromEvents(events); 
    return data; 
    } 
} 

function getDataFromEvents(events) {...} 

module.exports = Service; 

Làm thế nào để chế nhạo constructor với Sinon.JS để châm biếm getEvents của internalService để kiểm tra getData?

Tôi đã xem Javascript: Mocking Constructor using Sinon nhưng không thể trích xuất giải pháp.

// test.js 
const chai = require('chai'); 
const sinon = require('sinon'); 
const should = chai.should(); 

let Service = require('service'); 

describe('Service', function() { 
    it('getData', function() { 
    // throws: TypeError: Attempted to wrap undefined property Service as function 
    sinon.stub(Service, 'Service').returns(0); 
    }); 
}); 
+0

Hãy xem câu hỏi này: [Javascript: Mocking Constructor sử dụng Sinon] (https://stackoverflow.com/questions/14569499/javascript-mocking-constructor-using-sinon). – sdgluck

+0

@sdgluck Tôi đã làm, nhưng tôi đã không thể giải nén giải pháp cho trường hợp của tôi – krl

+0

Bản sao có thể có của [Javascript: Xây dựng mô phỏng bằng Sinon] (https://stackoverflow.com/questions/14569499/javascript-mocking-constructor- sử dụng-sinon) –

Trả lời

17

Bạn có thể tạo không gian tên hoặc tạo cá thể sơ khai bằng cách sử dụng sinon.createStubInstance (điều này sẽ không gọi hàm tạo).

Tạo một không gian tên:

const namespace = { 
    Service: require('./service') 
}; 

describe('Service', function() { 
    it('getData', function() { 
    sinon.stub(namespace, 'Service').returns(0); 
    console.log(new namespace.Service()); // Service {} 
    }); 
}); 

Tạo một trường hợp còn sơ khai:

let Service = require('./service'); 

describe('Service', function() { 
    it('getData', function() { 
    let stub = sinon.createStubInstance(Service); 
    console.log(stub); // Service {} 
    }); 
}); 
+0

cảm ơn! và làm cách nào để thêm mô hình 'this.internalService.getEvents' trả về một chuỗi? – krl

+0

Trong câu trả lời này 'stub' sẽ có mỗi phương thức từ' internalService' dưới dạng 'sinon.stub'. Vì vậy, bạn có thể làm điều này: 'stub.getEvents.returns (" một số chuỗi ")' – sdgluck

+1

@sdgluck Tôi đã tìm ra. Đây là những gì tôi cần 'let stub = sinon.createStubInstance (Service); stub.internalService = {getDataFromEvents: function() {return 'test'; }}; mong đợi (stub.getData()). to.equal (...); ' – krl

1

Kể từ sinon.createStubInstance đã bị xóa khỏi các phiên bản mới nhất của Sinon, tôi sẽ đề nghị stubbing phương pháp dụ cá nhân trên nguyên mẫu, để đạt được hiệu quả mong muốn. Một cái gì đó như thế này:

const spy = sinon.stub(InternalService.prototype, 'getEvents').returns([{ id: 1 }]); 
const internalService = new InternalService(); 
console.log(internalService.getEvents()); 
// => [{ id: 1 }] 
+0

'createStubInstance' chưa bị xóa khỏi sinon: [tuyên bố sinon.createStubInstance] (https://github.com/sinonjs/sinon/blob/master/lib/sinon/stub.js#L63) –