首页 > 解决方案 > 在同一服务中模拟一个函数以进行单元测试

问题描述

我在 Angular 6 中有此类服务:

   export class AppService {

     setValues(): Observable<any> {

       const vm: any = this;
       return new Observable(observer => {
       vm.currentValues().subscribe(data => {
           // continue modifying data and reset it

        });
     });
   }

   public currentValues(): Observable<any> {


   return new Observable(observer => {
     observer.next('data goes here')

    });

  } 
 }

currentValues() 是非常随机的,因此无法对其进行中继。如何在我的 unittest 文件中模拟它并在测试 setValues() 方法时使用它?

我已经尝试了以下方法,但我看不到如何使用它?

export function mockCurrentValues () : Observable<any> {

    return of(
      'data'
    )
  }

标签: angular

解决方案


假设AppService是一个@Injectable()并且您正在为提供者编写单元测试。你可以使用spys提供的Jasmine Framework

https://jasmine.github.io/2.0/introduction.html#section-Spies

import { getTestBed, TestBed } from '@angular/core/testing';
import { AppService } from 'path/to/app/service';
import { of } from 'rxjs';

describe( 'App Service', function() {
    let appService : AppService;

    beforeEach( function() {
        TestBed.configureTestingModule( {
            providers: [ AppService ],
        } );
        const injector = getTestBed();
        appService = injector.get( AppService );

        spyOn( appService, 'currentValues' ).and.callFake( () => {
            return of( 'data' );
        } );
    } );

    describe( 'setValues', function() {

        it( 'should set correct values', function() {
            appService.setValues().subscribe();
            // setValues will receive 'data' from the spy we just created while calling currentValues() method
            // write your unit tests here
        } );

    } );
} );

推荐阅读