web-dev-qa-db-ja.com

TypenonでSinonを使用するにはどうすればよいですか?

TypeScriptでsinonを使用している場合、sinonモックをオブジェクトのインスタンスにキャストするにはどうすればよいですか?

たとえば、SinonMockが返されますが、テスト対象のコントローラーでは、コンストラクターに渡される特定のサービスが必要になる場合があります。

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

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

Typeonでsinonを使用できますか?

22
Brandon

特定の型に絞り込む前に、<any>型アサーションを使用して型を広くする必要がある場合があります。

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

Sinonの1つの動作を明確にするために-MyStuff.MyServiceを渡しますが、mockメソッドに渡すものはすべて、より良いエラーメッセージを提供するためにのみ使用されます。

モックにメソッドとプロパティを持たせたい場合、 追加する必要があります

自動的に作成された偽物が必要な場合は、 tsUnit からFakeFactoryを取得できます。これにより、オーバーライドすることを選択できるいくつかのデフォルト値を持つ偽物バージョンが作成されます。 (さらに、あまり多くのモック機能を使用しないことで、実装ではなく動作をテストすることができます)。

FakeFactoryの使用例:

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

Sinonは、mockの代わりにcreateStubInstanceメソッドを使用すると、コンストラクターに基づいてスタブを非常に簡単に作成できます。

mochachaisinon 、および sinon-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  = sinon.createStubInstance(MyStuff.MyService),
            controller = new MyStuff.MyController(myService as any, ...);

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

記事を公開しました 。これは、さまざまなテストダブルとSinon.jsでそれらを使用する方法について詳しく知りたい場合に役立ちます。

お役に立てれば!

ヤン

17
Jan Molak