2015-01-26 17 views
13

Nếu tôi sử dụng sinon với bản đánh số thì làm cách nào để truyền mô hình sinon vào một thể hiện của đối tượng của tôi?Làm cách nào để sử dụng Sinon với Typecript?

Ví dụ một SinonMock sẽ được trả về nhưng bộ điều khiển của tôi đang được kiểm tra có thể yêu cầu một dịch vụ cụ thể được truyền vào phương thức khởi tạo của nó.

var myServiceMock: MyStuff.MyService = <MyStuff.MyService (sinon.mock(MyStuff.MyService)); 

controllerUnderTest = new MyStuff.MyController(myServiceMock, $log); 

Có thể sử dụng sinon với Typecript không?

Trả lời

5

Bạn có thể cần phải sử dụng một <any> loại khẳng định để làm cho loại rộng trước khi bạn thu hẹp nó để loại hình cụ thể của bạn:

var myServiceMock: MyStuff.MyService = 
    <MyStuff.MyService> <any> (sinon.mock(MyStuff.MyService)); 

Chỉ cần làm rõ một hành vi của Sinon - mặc dù bạn vượt qua trong MyStuff.MyService, bất cứ điều gì bạn chuyển sang phương thức mock chỉ được sử dụng để cung cấp thông báo lỗi tốt hơn.

Nếu bạn muốn mô hình có phương pháp và thuộc tính, you need to add them.

Nếu bạn muốn tạo hàng giả tự động, bạn có thể lấy FakeFactory từ tsUnit, tạo phiên bản giả với một số giá trị mặc định mà bạn có thể chọn ghi đè - trong JavaScript đây là công cụ khá dễ dàng (cộng với không sử dụng quá nhiều giả chức năng, bạn có thể đảm bảo bạn đang thử nghiệm hành vi thay vì thực hiện).

Ví dụ sử dụng FakeFactory:

var target = tsUnit.FakeFactory.getFake<RealClass>(RealClass); 
var result = target.run(); 
this.areIdentical(undefined, result); 
+1

Vâng, tôi đã làm điều gì đó tương tự như vậy. Tôi cũng đã học được rằng tôi đã sử dụng đối tượng sinon không chính xác, tôi đã không nhận ra tất cả những gì tôi cần làm là sử dụng cá thể MyService gốc trong các cuộc gọi và nó sử dụng các mock/cuống sinon. Những gì bạn đã đặt ở đây có vẻ đúng cho những gì tôi đã yêu cầu trong mọi trường hợp, cảm ơn! – Brandon

+0

Tôi đã trở lại điều này và có vẻ như nó không hoạt động. myServiceMock không xuất hiện như nó có bất kỳ phương thức nào. Bất kỳ ý tưởng? – Brandon

+0

Bạn đã cho nó một kỳ vọng? 'myServiceMock.expects (" doSomething ") trả về (42);' – Fenton

11

Sinon có thể tạo một sơ khai dựa trên một constructor khá dễ dàng nếu, thay vì mock, bạn sử dụng phương pháp createStubInstance.

Một ví dụ sử dụng mocha, chai, sinonsinon-chai, có thể trông như thế này:

import * as sinon from 'sinon'; 
import * as chai from 'chai'; 

// ... imports for the classes under test 

const expect = chai.expect; 
const sinonChai = require("sinon-chai"); 

chai.use(sinonChai); 

describe('MyController',() => { 
    it('uses MyService',() => { 

     let myService = <any> sinon.createStubInstance(MyStuff.MyService), 
      controller = new MyStuff.MyController(myService, ...); 

     // ... perform an action on the controller 
     // that calls myService.aMethodWeAreInterestedIn 

     // verify if the method you're interested in has been called if you want to 
     expect(myService.aMethodWeAreInterestedIn).to.have.been.called; 
    }); 
}); 

Tôi đã published an article, mà bạn có thể tìm thấy hữu ích nếu bạn muốn tìm hiểu thêm về nội dung đôi thử nghiệm khác nhau và cách sử dụng chúng với Sinon.js.

Hy vọng điều này sẽ hữu ích!

Jan

+2

Bạn cũng có thể sử dụng 'import * như sinonChai từ 'sinon-chai';' giả sử bạn đã cài đặt các kiểu: 'npm i --save-dev @ types/sinon-chai'. – Westy92

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