Angular 2集成测试(单元测试样式)

lex*_*ith 6 integration-testing jasmine karma-jasmine angular

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

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

我知道,这不应该是最好的(甚至只是一个好的)练习,但这不是这里的主题.我搜索过的所有地方(我搜索了很多)我都会找到方法MockBackend并且声明"我们不想打到真正的后端......"但是如果有可能则无处可去,如果有的话,怎么做.

我尝试了几种方法("正常"与异步测试),从我的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);
    });

    ...

}));
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

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

编辑:

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