如何在Angular中对行为主题进行单元测试

时间:2018-12-26 06:15:23

标签: angular typescript unit-testing angular6 angular7

我想测试my user.store.ts的获取和设置方法。我有一个get(),用于获取usersaddUsers(),用于将用户添加到BehaviourSubject中。我该如何实现?

import { Injectable } from '@angular/core';
import { BehaviorSubject } from 'rxjs';
import { User } from 'ngx-login-client';

@Injectable({
  providedIn: 'root'
})

export class UserStore {

  private _users: BehaviorSubject<User[]> = new BehaviorSubject([]);

  get users() {
    return this._users.asObservable();
  }

  addUsers(users: User[]) {
    this._users.next(users);
  }
}

我期望输出是在调用addUsers()时添加的值,并且在我调用get时可以get users()个用户。我是Angular Testing的新手。

出现类似以下错误:

  

Expected Observable({ _isScalar: false, source: BehaviorSubject({ _isScalar: false, observers: [ ], closed: false, isStopped: false, hasError: false, thrownError: null, _value: [ Object({ attributes: Object({ fullName: 'name', imageURL: '', username: 'myUser' }), id: 'userId', type: 'userType' }) ] }) }) to equal [ Object({ attributes: Object({ fullName: 'name', imageURL: '', username: 'myUser' }), id: 'userId', type: 'userType' }) ].

我的User[]类型:

{
    'attributes': {
        'fullName': 'name',
        'imageURL': '',
        'username': 'myUser'. 
    },
    'id': 'userId',
    'type': 'userType'
}

更新:我的user.store.spec.ts文件

import { TestBed, async } from '@angular/core/testing';

import { UserStore } from './user.store';
import { BehaviorSubject } from 'rxjs';
import { User } from 'ngx-login-client';

describe('UsersStore', () => {
  beforeEach(() => TestBed.configureTestingModule({}));

  it('should be created', () => {
     const store: UserStore = TestBed.get(UserStore);
     expect(store).toBeTruthy();
  });
  it('should add Users', async(() => {
    let store: UserStore;
    store = TestBed.get(UserStore);
    let user: User[];
    const testUser: User[] = [{
      'attributes': {
      'fullName': 'name',
      'imageURL': '',
      'username': 'myUser'
    },
    'id': 'userId', 
    'type': 'userType'
   }];
   store.addUsers(testUser);
   store.users.subscribe(users => {
     expect(users).toBe(testUser);
     });
  }));
});`

1 个答案:

答案 0 :(得分:0)

就像说错误一样,给定的数据是可观察的,但是您的测试用例是对象。

您必须这样写:

it('should get users', async(() => {
  component.users.subscribe(users => {
    fixture.detectChanges()
    expect(users).toBe(testUsers)
  })
}))