【问题标题】:Mock a dependency within a service模拟服务中的依赖项
【发布时间】:2020-03-28 01:57:20
【问题描述】:

我正在尝试模拟服务中的依赖项。我不知道出了什么问题.. 它并不是一个很好的测试类,但它都是关于代码覆盖率的——这里是服务

@Injectable()
export class SessionService {
    constructor(private sessionStore: UserStore){}

    login(userData: User) {
        this.sessionStore.login(userData);
    }
    logout(){
        this.sessionStore.logout();
    }
}

依赖的 UserStore 看起来像这样:

export function createInitialState(): User {
    return {
        id: 0, password: "", role: undefined, username: "",
    }
}
@Injectable()
@StoreConfig({ name: 'session', resettable: true })
export class UserStore extends Store<User> {
    constructor() {
        super(createInitialState());
    }

    login(user: User){
        this.update(user);
    }

    logout(){
        this.reset();
        this.update(createInitialState());
    }

    getCurrentUser(){
        return this.getValue();
    }
}

单元测试:

describe('SessionService', () => {
   // @ts-ignore
   let sessionService: SessionService;
   let userStoreMock;
   beforeEach(() => {

       userStoreMock = {
           login: jest.fn(),
           logout: jest.fn()
       };

       TestBed.configureTestingModule({
           providers:[{ provide: UserStore, useValue: userStoreMock}]
       });

       sessionService = TestBed.get(SessionService);
   });

    it('should be defined', () => {
        expect(sessionService).toBeDefined();
    })
});

我得到的错误是:

TypeError: Cannot read property 'getComponentFromError' of null

【问题讨论】:

  • 您没有向 TestBed 提供 SessionService 吗?但试图从 TestBed sessionService = TestBed.get(SessionService);
  • @Ininiv 我在传递它时仍然遇到同样的错误

标签: angular typescript jestjs


【解决方案1】:

为了模拟服务,您应该从要使用的方法创建一个间谍对象 (jasmine.createSpyObj),然后模拟这些方法的返回值。

例如:

let mockService;

mockService = jasmine.createSpyObj(['methodOne', 'methodTwo']);
mockService.methodOne.and.returnValue(of(MOCKED_DATA_1));
mockService.methodTwo.and.returnValue(of(MOCKED_DATA_2));

然后在 configureTestingModule 的提供者中设置 mockService:

TestBed.configureTestingModule({
   ...
   providers: [
       ...
       {
           provide: MyService, useValue: mockService
       }
   ]
})

【讨论】:

    【解决方案2】:

    SessionService 未添加到提供者列表中。

    配置应该是

    TestBed.configureTestingModule({
        providers:[
            SessionService,
            { provide: UserStore, useValue: userStoreMock}
        ]
    });
    

    在此之后,如果您遇到同样的问题,请在beforeEach() 中添加以下代码。

    TestBed.resetTestEnvironment();
     TestBed.initTestEnvironment(BrowserDynamicTestingModule,
        platformBrowserDynamicTesting());
    

    Test.ts

    import 'core-js/es7/reflect';
    import 'zone.js/dist/zone';
    import 'zone.js/dist/zone-testing';
    import { getTestBed } from '@angular/core/testing';
    import {
      BrowserDynamicTestingModule,
      platformBrowserDynamicTesting
    } from '@angular/platform-browser-dynamic/testing';
    
    declare const require: any;
    
    // First, initialize the Angular testing environment.
    getTestBed().initTestEnvironment(
      BrowserDynamicTestingModule,
      platformBrowserDynamicTesting()
    );
    // Then we find all the tests.
    const context = require.context('./', true, /\.spec\.ts$/);
    // And load the modules.
    context.keys().map(context);
    

    【讨论】:

    • 我收到错误:无法解析 ApplicationModule 的所有参数:(?)。完成所有这些操作后出现错误。
    • test.ts 可能有问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-12
    • 2019-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多