Angular 2组件中的单元测试“成功”和“错误”可观察到的响应

bmd

我正在为调用服务OnInit的组件编写单元测试。如果响应是“成功”,则采取一个动作,而另一个则采取“错误”。

测试这两种情况的最佳方法是什么?我已经创建了组件和单元测试的简化版本。在这两种情况下,我都可以轻松地进行测试。

我已经尝试在此处实施解决方案但是必须停止实施。我也试图抛出一个错误,正如您将在规范和评论中看到的那样。

零件

@Component({
  selector: 'app-observer-throw-unit-test',
  template: '<p>{{ data }}</p>'
})
export class ObserverThrowUnitTestComponent implements OnInit {
    public data: string;

    constructor(private _observerThrowService: ObserverThrowService) { }

    ngOnInit() {
        this._observerThrowService.getData().subscribe(
            (data) => {
                this.data = data;
            },
            (error) => {
                this.redirect()
            }
        )
    }

    redirect() {
        this.data = "Redirecting...";
    }

}

规格

const data: string = "Lorem ipsum dolor sit amet.";

const ObserverThrowServiceStub = {
  error: false,
  getData() {
    return Observable.create((observer) => {
      if(this.error) {
        observer.error(new Error());
      } else {
        observer.next(data);
      }
      observer.complete();
    })
  }
}

describe('ObserverThrowUnitTestComponent', () => {
  let component: ObserverThrowUnitTestComponent;
  let fixture: ComponentFixture<ObserverThrowUnitTestComponent>;
  let _observerThrowService: ObserverThrowService;

  beforeEach(async(() => {
    TestBed.configureTestingModule({
      declarations: [ ObserverThrowUnitTestComponent ],
      providers: [
        { provide: ObserverThrowService, useValue: ObserverThrowServiceStub },
      ]
    })
    .compileComponents();
  }));

  beforeEach(() => {
    fixture = TestBed.createComponent(ObserverThrowUnitTestComponent);
    component = fixture.componentInstance;
    fixture.detectChanges();
    _observerThrowService = TestBed.get(ObserverThrowService);
  });

  it('should set "data" to "Lorem ipsum dolor sit amet." on success', () => {
      expect(component.data).toEqual("Lorem ipsum dolor sit amet.");
  });

  it('should set "data" on "Redirecting..." on error',() => {
    ObserverThrowServiceStub.error = true;
    // spyOn(_observerThrowService, "getData").and.returnValue(Observable.throw("error")); // This did not work and returned : TypeError: undefined is not a constructor (evaluating 'Observable_1.Observable.throw("error")') in src/test.ts
    spyOn(_observerThrowService, "getData")
    expect(component.data).toEqual("Redirecting...");
  });

  it('should set "data" on "Redirecting..." on error',() => {
    // This works after setting error to true in the previous test
    spyOn(_observerThrowService, "getData")
    expect(component.data).toEqual("Redirecting...");
  });

});
史蒂夫·兰德

我将创建两个模拟-一个引发错误:

class ObserverThrowServiceStub {
  getData() {
    return Observable.throw(new Error('Test error'));
  }
}

并成功返回。

class ObserverSuccessServiceStub {
  getData() {
    return Observable.from(data);
  }
}

然后,不是为所有测试提供相同的模拟服务,而是根据所涉及的测试适当地提供失败/成功的模拟服务(显然,您需要将模块配置移动到可在每个测试中调用的可配置方法中)而不是.beforeEach()代码中。

此处有一篇非常不错的文章,涉及使用Observables测试Angular服务(正是使用此模型):http : //www.zackarychapple.guru/angular2/2016/11/25/angular2-testing-services.html

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在angular2中手动引发可观察到的错误?

Angular 2可观察到多个订户

Angular 4-可观察到的捕获错误

在Angular 2中对可观察对象进行单元测试

Angular2 @ TypeScript可观察到的错误

在Angular2中,如何拦截可观察到的错误响应并将其传递给错误通道

我应该如何对已导入其他模块(和组件)的Angular2组件和模块进行单元测试

Angular2 2.0.0组件单元测试导致错误:在注入路由器之前引导至少一个组件

在测试angular2组件时如何模拟可观察的流?

在Angular2中可观察到的组件属性变化

Angular 2单元测试可观察到的错误(HTTP)

Angular 2缓存可观察到的http结果数据

angular2中的单元测试spyOn可观察服务

可观察到的服务在组件NgOnInIt中不起作用-Angular2

Angular2-单元测试可观察到的错误“无法读取未定义的属性'subscribe'”

Angular 2/4组件单元测试单击事件不会触发更改

Angular5从可观察到组件获取数据

Angular RxJS可观察到的加载错误

在Angular中使用if条件等待可观察到的响应

可观察到的Angular和Cloud Firestore无法完成

订阅Angular 8中可观察到组件的问题

在Angular组件和非Angular组件之间进行通信:从可观察到的回调中返回数据

如何在Angular Jasmine Spec中测试主题和可观察到的返回值?

如何在Angular 9组件单元测试中调用伪函数

当您进行返回可观察到的HTTP调用时,如何在Angular单元测试中使用fakesAync?

Angular2 TypeScript可观察到的问题

在单元测试中模拟Angular 1.5组件

如何在Angular 1.5组件中对功能进行单元测试

Angular2可观察到的回调