如何在 Angular 中对行为主题进行单元测试
How to unit test Behaviour Subjects in Angular
我想测试 my user.store.ts
的获取和设置方法。我有一个 get()
用于获取 users
和 addUsers()
用于将用户添加到 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);
});
}));
});`
如错误所述,给定数据是可观察的,但您的测试用例是对象。
你必须这样写:
it('should get users', async(() => {
component.users.subscribe(users => {
fixture.detectChanges()
expect(users).toBe(testUsers)
})
}))
我想测试 my user.store.ts
的获取和设置方法。我有一个 get()
用于获取 users
和 addUsers()
用于将用户添加到 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);
});
}));
});`
如错误所述,给定数据是可观察的,但您的测试用例是对象。
你必须这样写:
it('should get users', async(() => {
component.users.subscribe(users => {
fixture.detectChanges()
expect(users).toBe(testUsers)
})
}))