所以我试图用Jest / Spectator设置我的项目,因为这似乎是开发测试的一种非常简洁的方法,但是我遇到了组件和服务的依赖问题。完全嘲弄他们不是主要问题,改变他们的行为以做不同的事情是主要问题。
说我有一个服务,该服务在我当前的测试中似乎总是未定义的,返回的东西。并且当它是可观察到的(例如使用ReplaySubject返回数组)或任何链接的对象时,它似乎不起作用。或者,当我想知道调用多少次(或使用什么参数)时,似乎不匹配。我知道,对于Jest,要加载的模块是不同的,并且与Karma / Jasmine相比,Jest的语法是不同的(例如,mockReturnValue代替.and.returnValue),但它似乎仍然无法正常工作或破坏测试。
要让子组件根据我输入的数据进行更改或触发onChange事件,似乎很难找出其应该如何运行。与向混合中添加路由时一样,当您想使事情变得动态时,一切似乎都变得平坦了。
Jest and Spectator的文档似乎很基础,并且没有真正涵盖您实际开始使用该东西的部分。我不得不审视问题,看看是什么,那使事情很难弄清。
那么要遵循哪些示例,一些最佳实践以及可以借鉴的东西?我主要研究如何正确模拟服务,以便根据组件或服务与他人之间的通信方式来更改其行为。我发现进行任何测试工作的唯一方法是完全模拟整个过程,但是我并没有真正很好地测试组件的内容。
我知道Jest / Spectator不是Angular的默认设置,但是我很久以来不喜欢Karma / Jasmine,并想尝试一些不同的东西。
所以说我有这样的服务:
import { Injectable } from '@angular/core';
import { ReplaySubject, Observable } from 'rxjs';
/**
* Some Service to do stuff
*/
@Injectable({
providedIn: 'root',
})
export class SomeService {
private myData: string[]; // some data that gets managed here
private _name$ = new ReplaySubject<string[]>(); // some name that gets updated by different components/services
nameObservable: Observable<string[]>; // for example when it is set without a function (though I did see there were issues with this)
constructor() {
this.nameObservable = this._name$.asObservable(); // for when values get set in the constructor
}
// this is a function that gets called from somewhere else
setName(name: string): void {
this._name$.next([name]);
}
setMyData(): void {
// this data can come from somewhere else in the application but I want to mock whatever this returns.
this.myData = ['stuff'];
}
getSomeData(stuff: string): string {
return stuff + 'otherStuff';
}
}
当它是依赖项时,如何在另一个测试中模拟它并修改其输出?订阅结果时出现问题,或者功能不存在。甚至观众也变得不确定。但是,我不仅想解决当前的问题,还想知道正常的工作方式是什么。
因此,在一次测试中:
我当然可以返回Karma / Jasmine并丢弃Spectator,但我认为在某些帮助下,我不仅可以使我的测试正常运行,而且由于我觉得零件缺失和and窃,还为Spectator和/或Jest更新了文档。对此组合还没有足够的疑问。看到测试有多快以及调试有多容易(只要您知道自己在做什么以及应该使用什么语法),我无疑这很快就会流行起来……