Sinon:测试一个setter抛出一个不起作用的异常

时间:2018-01-08 13:35:04

标签: angular unit-testing jasmine karma-runner sinon

我试图测试一个Angular组件的setter会使用Sinon引发错误。我的组件看起来像这样:

@Input( 'sceneMode' ) set sceneMode( newSceneMode: Cesium.SceneMode ) {
    const scene = this.cesiumViewerService.getScene();

    switch ( newSceneMode ) {
        case Cesium.SceneMode.SCENE2D:
            scene.morphTo2D( MORPH_DURATION );
            break;

        case Cesium.SceneMode.SCENE3D:
            scene.morphTo3D( MORPH_DURATION );
            break;

        case Cesium.SceneMode.COLUMBUS_VIEW:
            scene.morphToColumbusView( MORPH_DURATION );
            break;

        default:
            throw new Error( `Cannot morph to SceneMode type ${newSceneMode}` );
    }
}

我的测试看起来像这样:

it( 'should throw an error on invalid scene mode', () => {
    sceneModeStub = sinon.stub( component, 'sceneMode' );
    try {
        sceneModeStub.sceneMode = 0;
    } finally {
        assert( sceneModeStub.threw() );
    }
} );

我试过将assert移到finally块之外。我也尝试过使用:

sceneModeStub = sinon.sandbox.stub( component, 'sceneMode' );

但是Karma报道:

  

AssertionError:false == true

我确定0是无效的sceneMode,事实上如果我删除了try / finally,应用程序会在组件的setter中抛出错误。

我该如何测试?

1 个答案:

答案 0 :(得分:0)

旧问题,但仍需回答。

在我看来,您正在存根要测试的方法,这是错误的。您要测试的方法应始终保持原始形式,仅存根依赖项。

在测试异常时,应将一个函数传递给sinon,该函数可以调用该函数以引发异常。这应该可行:

it( 'should throw an error on invalid scene mode', () => {
    assert.threw( () => {
        sceneModeStub.sceneMode = 0;
    }, 'Cannot morph to SceneMode type 0')
} );