typescript - 在 Jest 中,我如何对订阅 observable 的方法进行单元测试

标签 typescript unit-testing jestjs rxjs-observables

我的组件中有各种方法订阅注入(inject)依赖项中的方法,这些方法返回可观察对象。

我想编写 Jest 单元测试以确保当这些可观察对象返回/错误时,我的方法会做正确的事情。

在下面的示例中,我正在尝试编写一个测试来检查 doAThing已经开除了。以下测试均无效。他们都因错误而失败,例如

'returnMyObservable.subscribe is not a function'.


// Example method to test component 
public testFunction (): void {
    this.myService.returnMyObservable.subscribe(
        ( value ) => this.doAThing( value )
    )
}

describe( 'myComponemt', () => {

    let fixture;
    let myServiceMock;

    beforeEach( () => {
        myServiceMock = {
            returnMyObservable: fn()
        }

        fixture = new myComponent( myServiceMock );
    });


    // 1) I have tried mocking with a returned value
    it ( 'should call do a thing when value is returned', () => {
        myServiceMock.returnMyOnservable.mockReturnValue( true );

        fixture.testFunction();

        expect( fixture.doAThing ).toHaveBeenCalled();
    });

    // 2) I have tried returning an observable
    it ( 'should call do a thing when value is returned', () => {
        myServiceMock.returnMyOnservable.mockReturnValue( of( true ) );

        fixture.testFunction();

        expect( fixture.doAThing ).toHaveBeenCalled();
    });

});

最佳答案

我还有一些其他错误掩盖了我的测试实际出了什么问题——我发现测试上述功能的最佳方法是:

describe( 'MyComponent', () => {
    let fixture;
    let myServiceMock;

    beforeEach( () => {
        myServiceMock = {
            returnMyObservable: jest.fn()
        }

        fixture = new MyComponent( myServiceMock );
    });

    it ( 'should call doAThing when value is returned', () => {
        const doAThingSpy = jest.spyOn( fixture, 'doAThing' );
        myServiceMock.returnMyObservable.mockReturnValue( of( true ) );

        fixture.testFunction();

        expect( doAThingSpy ).toHaveBeenCalledWith( true );
    });
});

(这与 Jasmine 中的做法几乎相同)

关于typescript - 在 Jest 中,我如何对订阅 observable 的方法进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58815471/

相关文章:

Typescript 在 super 原型(prototype)上声明一个可选方法

typescript - 如何检查 TypeScript 中的开关 block 是否详尽无遗?

ios - 如何将核心数据用于主要应用程序和单元测试?

javascript - 使用 Jest 模拟简单的内部函数以在渲染的 React 组件中使用

javascript - Jest 不加载环境变量(即使使用 --setupFiles dotenv/config)

reactjs - Jest 无法加载时刻

angular - 网络 Storm 。如何在html文件中的插值表达式('{{'和 '}}')中添加空格?

html - 为什么 CSS 样式不适用于具有 Vaadin 元素的 Angular 2 组件?

powershell - 我的测试代码和功能代码是否需要位于同一目录中才能使 Pester Code Coverage 正常工作?

unit-testing - .net core Url.Action mock,怎么做?