标签: angular2-testing

Angular2 - 测试已调用注入的私有服务方法

首先,我理解我不应该测试私有方法,但是我觉得有时我应该测试是否基于某些逻辑调用了私有方法.

我正在围绕angular 2 http服务构建一个包装器服务,这样我就可以进行全局错误处理,而无需将代码写入每个http请求.

该类的一小部分样本如下:

export class ApiService {
  constructor(private http: Http, private error: Error, private apiConfig: ApiConfig) {}

  public get(url: string, options: RequestOptionsArgs={}): Observable<any> {
   return this.http.get(url, options).catch((error: any) => {
     this.error.dispatch(error);
     return error;
   });
  }
}
Run Code Online (Sandbox Code Playgroud)

如果我想测试get方法并使用Error响应模拟响应以便catch触发,我无法测试是否调用了error.dispatch方法,因为这是私有的.我不能窥探私人方法.

你可能会争辩说我真的只是测试'catch'被解雇了,如果它确实显然内部的方法会被触发但是这只会测试http服务本身.我想确保在发送'catch'时将error.dispatch添加为调用,如果由于某种原因它被其他开发人员删除则会失败.也许这是一种不好的测试方法?我接受其他建议.

我可以像这样模拟私人课程:

{ provide: Error, useClass: FakeError }
Run Code Online (Sandbox Code Playgroud)

但是ApiService类的蓝图保持不变,现在的FakeError服务仍然是私有的.在Java中,您可以自己创建实例并注入它,因为您拥有它可以访问它.我想我正试图找到一种方法在jasmine/typescript/angular2中做到这一点?

jasmine angular2-testing angular

3
推荐指数
1
解决办法
1975
查看次数

Angular 2.1无法设置基本提供程序,因为它已被调用(...)

我正在尝试测试包含服务的基本角度2组件.当我运行测试时,我遇到以下错误.组件,服务和测试都很小,它们在浏览器中运行良好.我不确定我在测试中缺少什么才能使它工作.

任何帮助表示赞赏.

Uncaught Error: Cannot set base providers because it has already been called(…)

Uncaught Error: Error in ./TestComponent class TestComponent - inline template:0:0 caused by: No provider for Http!
Error: No provider for Http!
    at NoProviderError.BaseError [as constructor] (http://localhost:9876/base/karma-shim.js:4006:34)
    at NoProviderError.AbstractProviderError [as constructor] (http://localhost:9876/base/karma-shim.js:33221:16)
    at new NoProviderError (http://localhost:9876/base/karma-shim.js:33252:16)
    at ReflectiveInjector_._throwOrNull (http://localhost:9876/base/karma-shim.js:57969:19)
    at ReflectiveInjector_._getByKeyDefault (http://localhost:9876/base/karma-shim.js:57997:25)
    at ReflectiveInjector_._getByKey (http://localhost:9876/base/karma-shim.js:57960:25)
    at ReflectiveInjector_.get (http://localhost:9876/base/karma-shim.js:57769:21)
    at TestBed.get (http://localhost:9876/base/karma-shim.js:5778:67)
    at ElementInjector.get (http://localhost:9876/base/karma-shim.js:58133:48)
    at _View_TestComponent0.createInternal (TestComponent.ngfactory.js:21:68)
    at _View_TestComponent0.AppView.create (http://localhost:9876/base/karma-shim.js:58492:21)
    at _View_TestComponent0.DebugAppView.create (http://localhost:9876/base/karma-shim.js:58704:44)
    at _View_TestComponent_Host0.createInternal (TestComponent_Host.ngfactory.js:18:14)
    at …
Run Code Online (Sandbox Code Playgroud)

typescript angular2-testing angular

2
推荐指数
2
解决办法
3135
查看次数

预期['/']为['/'] - 它们看起来一样

我正在尝试测试路由器插座.

我最初有:

expect(landingPageLink).toBe('/', '1st link should go to landing page');
Run Code Online (Sandbox Code Playgroud)

我收到了这个错误:

错误:预期['/']为'/','第一个链接应该登陆'.

所以改成了这个:

expect(landingPageLink).toBe(['/'], '1st link should go to landing page');
Run Code Online (Sandbox Code Playgroud)

现在我收到这个错误:

错误:预期['/']为['/'],'第一个链接应该转到目标网页'.

在底部错误中它们看起来相同.怎么会不一样?

全面测试:

import 'zone.js/dist/long-stack-trace-zone.js';
import 'zone.js/dist/async-test.js';
import 'zone.js/dist/fake-async-test.js';
import 'zone.js/dist/sync-test.js';
import 'zone.js/dist/proxy.js';
import 'zone.js/dist/jasmine-patch.js';

import {
    ComponentFixture,
    TestBed,
    async,
    fakeAsync
} from '@angular/core/testing';
import {
    BrowserDynamicTestingModule,
    platformBrowserDynamicTesting
} from '@angular/platform-browser-dynamic/testing';
import { By } from '@angular/platform-browser';
import {
    DebugElement,
    Component,
    ViewChild,
    Pipe,
    PipeTransform,
    CUSTOM_ELEMENTS_SCHEMA,
    NO_ERRORS_SCHEMA
} from '@angular/core';
import { DatePipe } from '@angular/common';
import { Router, …
Run Code Online (Sandbox Code Playgroud)

stub jasmine angular2-routing angular2-testing angular

2
推荐指数
1
解决办法
195
查看次数

Angular2 单元测试鼠标事件

我想测试一种有助于在模态窗口容器外部关闭时关闭模态窗口的方法。

组件方法

public hide(): void {
    this.visibleAnimate = false;
    setTimeout(() => { this.visible = false; }, 200);
  }

public onModalClicked(event: MouseEvent): void {
    if ((<HTMLElement>event.target).classList.contains('dialog-container')) {
      this.hide();
    }
  }
Run Code Online (Sandbox Code Playgroud)

单元测试

it('should call hide method', fakeAsync(() => {
    component.hide();
    fixture.detectChanges();
    fixture.whenStable().then(() => {
      expect(component.visible).toEqual(false);
      tick(200);
      expect(component.visibleAnimate).toEqual(false);
    });
  }));



it('should call onModalClicked()', () => {
    const mockEvent = new Event('click'); --> Error
    component.onModalClicked(mockEvent);
    console.log(component.visible);
  });
Run Code Online (Sandbox Code Playgroud)

我的单元测试在hide()方法上运行良好,请让我知道我是否以正确的方式进行。

但我真的很困惑如何测试onModalClicked()方法,因为它以MouseEvent作为参数。

在我的单元测试方法中,发生 Event 和 MouseEvent 不匹配错误,这很明显,但如何覆盖此方法?

unit-testing karma-jasmine angular2-testing angular

1
推荐指数
1
解决办法
5058
查看次数