在我正在测试的类的 ngOnInit 方法中,我调用了一个重新运行可观察对象的服务函数。我已经为该服务实现了一个模拟,但我正在尝试使用间谍来完成这个确切的测试用例。根据我的理解,除非我在间谍上调用“.and.callThrough()”,否则间谍将覆盖模拟实现。问题是,尽管我为该函数设置了间谍,但每次模拟实现仍然会被执行。
我尝试将间谍移至 beforeEach 部分,但这没有帮助。我还尝试使用不带“.and.callFake()”扩展名的间谍。但这没有帮助。
规格.ts 文件:
fdescribe('AppComponent', () => {
let fixture;
let component;
let dataServiceMock: DataServiceMock;
beforeEach(async(() => {
TestBed.configureTestingModule({
imports: [RouterTestingModule],
declarations: [AppComponent],
providers: [{ provide: DataService, useClass: DataServiceMock }],
schemas: [CUSTOM_ELEMENTS_SCHEMA]
}).compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(AppComponent);
component = fixture.componentInstance;
fixture.detectChanges();
dataServiceMock = TestBed.get(DataService);
});
fit('should not show navigation if not logged in', async(() => {
spyOn(dataServiceMock,'getCurrentUser').and.callFake(() => {
console.log('IN CALL FAKE')
throwError(new Error('induced error'))
});
}));
Run Code Online (Sandbox Code Playgroud)
服务模拟的实现:
export class DataServiceMock {
currentUser: …Run Code Online (Sandbox Code Playgroud) 我在Angular应用程序中接收JSON对象:我想获取一些值,但问题是我无法创建TypeScript接口来匹配这些值,因为对于一个键,值可以是包含多个值的数组,也可以只是一个简单的值(见"关系").
一个例子:
{
"ID": "123",
"name": "dummy",
"relations": [
{ "rel": "child", "relValue": ["child1", "child2"] },
{ "rel": "parent", "relValue": "parent"}
]
}
Run Code Online (Sandbox Code Playgroud)
无论是否有数组或单个值,如何检索此键的所有元素("关系")的值?
我正在使用垫子滑块让用户设置一个值。该(input)事件发射器用于显示值“活”(而鼠标仍下跌)。这是有效的。目前,(change)事件发射器用于识别用户何时选择了一个值(释放鼠标)。
第一个问题是,在与滑块的正常交互期间,更改事件会被触发两次:一次是在初次单击滑块时,第二次是在释放滑块时。我希望仅在释放滑块时触发事件,或者具有可以区分两个事件并仅对释放事件起作用的功能。
第二个问题是,当设置了滑块的新值时,我必须发出 HTTP 请求。我不希望这种情况经常发生,所以我想暂停一下。只有当经过一定时间并且没有发生新的更改事件时,我才想要发出 HTTP 请求。
我已经尝试用锁来实现这一点,但它不起作用,因为有时只触发一个更改事件(例如,单击滑块而不是拖动它时),然后错误地翻转了锁定变量和锁定机制由于倒置变量而不再工作。
有没有办法解决这些问题并实现我想要的?