2015-01-26 85 views
13

如果我使用sinon和打字稿,那么我如何将sinon模拟投影到我的对象的一个​​实例?如何使用Sinon与Typescript?

例如一个SinonMock将被返回,但我的控制器在测试可能需要一个特定的服务传递给它的构造函数。

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

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

Sinon可以和Typescript一起使用吗?

回答

5

您可能需要你把它缩小到特定类型之前使用的<any>类型断言,使型宽:

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

只是为了澄清兴农的一个行为 - 虽然你在MyStuff.MyService传递,无论你传递给mock方法仅用于提供更好的错误消息。

如果要模拟有方法和属性,you need to add them

如果你想自动生成假货,你可以抓住FakeFactorytsUnit,创建一些默认值假的版本,您可以选择覆盖 - 在JavaScript中这是很简单的东西(加上没有使用太多的模拟功能,你可以确保你正在测试行为而不是实现)。

使用示例FakeFactory

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

是的,我做了类似的事情。我还了解到我正在使用sinon对象,我没有意识到我需要做的就是在调用中使用原始MyService实例,并使用sinon mocks/stubs。你在这里放的东西似乎对我在任何情况下所要求的都是正确的,谢谢! – Brandon 2015-01-29 14:22:32

+0

我回到了这里,它似乎不起作用。 myServiceMock没有出现,因为它有任何方法。有任何想法吗? – Brandon 2015-02-19 20:54:37

+0

你有没有给它一个期望? 'myServiceMock.expects(“doSomething”)。returns(42);' – Fenton 2015-02-20 19:06:37

11

兴农可以创造的,而不是mock基于构造很容易,如果存根,您使用createStubInstance方法。

使用mochachaisinonsinon-chai,看起来是这样的一个例子:

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; 
    }); 
}); 

我已经published an article,你可能会发现有用的,如果你想了解更多关于不同的测试双打以及如何将它们与Sinon.js一起使用。

希望这会有所帮助!

Jan

+2

你也可以使用'import *'作为'sinon-chai'的sinonChai;'假设你安装了类型:'npm我--save-dev @ types/sinon-chai'。 – Westy92 2016-12-20 17:59:26

相关问题