是否可以使用其测试框架(主要针对单元测试设计)针对真实后端测试角度应用程序?

让我们说使用量角器的E2E测试对我来说不是一个选项,但我仍然希望在我的单元测试环境中使用Karma进行一些集成测试 . 如果可能或不使用Jasmine和angular 2的测试库,我真的很难找到示例甚至声明 .

我知道,这不是这里的主题 . 我搜索过的所有地方(我搜索了很多)我会找到 MockBackend 的方法和声明"We don't want to hit the real backend...."但是如果可能的话,无处可去,如果是的话,怎么做 .

我尝试了几种方法(“正常”与异步测试),从我的Component Testbed中监视服务方法,直接调用Service函数(在发出后端请求后返回Observable)并尝试从订阅功能,但我的测试不关心 . 总是跳过这些部分 .

想象一下这样的事情:

fit('should show an error if the email entered is invalid', async(() => {
    let accService: any = fixture.debugElement.injector.get(AccountService);
    let accSpy: jasmine.Spy = spyOn(accService, 'isExistingEmail').and.callThrough();
    let checkEmailSpy: jasmine.Spy = spyOn(comp, 'checkEmail').and.callThrough();

    expect(checkEmailSpy).not.toHaveBeenCalled();
    emailInput.triggerEventHandler('blur', null);
    fixture.detectChanges();
    expect(checkEmailSpy).toHaveBeenCalled();
    expect(comp.emailInvalid).toBe(true);

    ...

    accService.isExistingEmail('abcdefg').subscribe((res) => {
        expect(accSpy).toHaveBeenCalledTimes(7);
    }, (err) => {
        expect(accSpy).toHaveBeenCalledTimes(7);
    });

    accSpy.calls.mostRecent().returnValue.subscribe((res) => {
        expect(accSpy).toHaveBeenCalledTimes(7);
    }, (err) => {
        expect(accSpy).toHaveBeenCalledTimes(7);
    });

    ...

}));

现在在这个测试的第一部分中, blur 事件将触发组件 checkEmail 函数,它将调用我的服务中的某些东西(然后它会向另一个服务询问实际的后端调用并返回此可观察对象) . 如果电子邮件错误, false 将返回组件功能, comp.emailInvalid 设置为true) .

这部分中的 toHaveBeenCalled 测试实际上是通过,但 expect(comp.emailInvalid).toBe(true) 部分没有 .

当我运行测试并打开Karma-Chrome-Launcher中的调试选项卡时,我实际上看到了对后端的真实请求以及正确的响应 . 所以请求实际上已经完成,但我只是没有将这些响应回到我的测试中 .

在本例的底部,我尝试直接使用该服务来获取我的响应 . 所以我试图 mock 实际的程序流来检索后端响应 . 但在这些情况下, expect 调用永远不会被触发 . 但是,如果我在实际服务中放置一些 console.log 语句,我会看到它们被调用两次(来自模糊事件和直接调用 accService.isExistingEmail ) .

任何提示我如何处理这一点将非常感激 .

主要原因是,我们不想设置模拟后端响应的大型模拟文件 .

编辑:

如果没有任何解决方案,我仍然不想使用E2E与量角器的UI测试,我将如何进行集成测试?