【问题标题】:How to unit test Behaviour Subjects in Angular如何在 Angular 中对行为主题进行单元测试
【发布时间】:2019-05-24 11:37:00
【问题描述】:

我想测试my user.store.ts 的get 和set 方法。我有一个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 users() 时可以get 用户。我是Angular 测试的新手。

得到类似的错误:

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);
     });
  }));
});`

【问题讨论】:

  • 我在这个问题上迟到了 - 你还有兴趣解决这个问题吗? :)
  • 不,谢谢 :)。我搞定了
  • 你是怎么做到的,请分享解决方案
  • 我不记得@Ratheesh,我不记得我是怎么做到的。那时我正在与 UI 团队合作 :)

标签: angular typescript unit-testing angular6 angular7


【解决方案1】:

就像错误所说,给定的数据是 Observable 但你的测试用例是 Object.

你必须这样写:

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

【讨论】:

  • @zamg,我收到一条错误消息,提示 Expected $.length = 0 to equal 1. Expected $[0] = undefined to equal Object({ attributes: Object({ fullName: 'name', imageURL: '', username: 'myUser' }), id: 'userId', type: 'userType' }).
  • 而store是用来存储数据的,你为什么写component
  • 你对此有什么提示/想法吗? @zmag
  • @GauravSingh 你能给我你写的任何测试代码吗?
猜你喜欢
  • 2019-11-02
  • 2021-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-25
  • 1970-01-01
  • 2016-04-09
  • 1970-01-01
相关资源
最近更新 更多