如何在茉莉花中为可观察的 finally 块编写单元测试 - Angular 2

Posted

技术标签:

【中文标题】如何在茉莉花中为可观察的 finally 块编写单元测试 - Angular 2【英文标题】:How to write a unit test for observable finally block in jasmine - angular 2 【发布时间】:2018-04-13 05:12:00 【问题描述】:

我有一个保存方法。

public saveJob(formData: any, redirect: boolean = false): Observable<any> 
    if (!this.checkJobValidity()) 
        return Observable.of(null);
    
    return this.service.edit(this.job)
        .do((data) => 
            this.job = data;
        )
        .switchMap(() => this.service.addCustomer(this.job.id, this.customers)
            .do(customers => 
                this.customers = customers;
            ))            
        .switchMap(() => this.saveJobComment())
        .switchMap(() => this.saveJobTasks())
        .switchMap(() => this.saveJobProducts(this.jobProducts))
        .finally(() => 
            const hasInvoiceNumbers: boolean = !!this.jobInvoiceNumbers.find(j => !!j.invoiceNumber);
            console.log(this.job.phase && this.isXeroCustomer && !hasInvoiceNumbers);
            if (this.job.phase === 'INVOICE' && this.isAutoCustomer) 
                this.createAutoInvoice();
             else if (isManualInvoice) 
                this.createManualInvoice();
            
            this.messageService.show(
                template: 'plain_string',
                level: 'success',
                context: message: `Job $this.job.code saved successfully.`,
                flash: redirect,
                timeout: this.config.ALERT_TIMEOUT
            );
            if (redirect) 
                this.router.navigate(['/jobs', this.job.id]);
            
        );

我想编写单元测试,看看自动发票是否正常工作。 IE;最后块。我已经模拟了 this.service.edit 和 this.service.addCustomer,我期待如果我模拟所有 switchMap 案例,它最终会出现在我的 finally 块中,我可以对其进行测试。我应该这样做吗?

【问题讨论】:

【参考方案1】:

我认为,如果您将 finally 块中的代码提取到一个方法中,您可以更轻松地测试您的代码。您应该能够在 finally 块中检测到针对该方法的间谍的 hasBeenCalled。然后,显然,您可以针对您创建的新方法对其余代码进行单元测试。

【讨论】:

以上是关于如何在茉莉花中为可观察的 finally 块编写单元测试 - Angular 2的主要内容,如果未能解决你的问题,请参考以下文章

:未声明为可写或没有setter

如何使用自动布局在 Swift 中为可重用的 UIView 设置约束?

在 Django 项目中为可重用应用程序创建基于类的 Celery 任务

如何在多租户应用程序的业务层中为可扩展的数据库结构设计实体?

final关键字

如何用茉莉花角度编写单元测试以实现滚动功能