【问题标题】:Unit testing rxjs in Angular [duplicate]Angular中的单元测试rxjs [重复]
【发布时间】:2022-02-03 12:46:30
【问题描述】:

我在为 Angular 中的 observable 编写单元测试时遇到问题...我尝试测试用例 displayPaymentsLineItem$ 是真还是假,具体取决于 mobileAccountBalance$ 和 selectedMobileDigitalBill$... 有人可以帮忙吗?

  public selectedMobileDigitalBill$: Observable<MobileDigitalBill>;
  public mobileAccountBalance$: Observable<MobileAccountBalance>;

  private expandedLinesMap: object = {};
  private expandedTaxesAndFees: boolean = false;
  private devices: MobileDevice[] = [];
  private destroy$: Subject<void> = new Subject();

  constructor(]
    private mobileStatementsTabFacade: MobileStatementsTabFacade,
    private billingMobileFacade: BillingMobileFacade,
  ) {}

  ngOnInit() {
        this.mobileAccountBalance$ = this.mobileStatementsTabFacade.mobileAccountBalance$;

        this.displayPaymentsLineItem$ = combineLatest([
          this.mobileAccountBalance$,
          this.selectedMobileDigitalBill$,
        ]).pipe(
          map(([mobileAccountBalance, selectedMobileDigitalBill]: [MobileAccountBalance, MobileDigitalBill]) => {
            const isPastDue: boolean = mobileAccountBalance?.pastdue > 0;
            const hasPayments: boolean = selectedMobileDigitalBill?.payments?.length > 0;

            return isPastDue && hasPayments;
          })
        );
      }
    });

【问题讨论】:

    标签: javascript angular typescript unit-testing


    【解决方案1】:

    您可以take(1)(取一个值,然后完成)并订阅以测试发出的值是否为假。如果您以这种方式测试 Observable,则需要完成它们。

    describe('The display payment line items observable', () => {
      it('should emit truthy', () => {
        displayPaymentsLineItem$
        .pipe(take(1))
        .subscribe(value =>{
          expect(value).toBeTruthy();
        });
      }
    }
    

    话虽如此,如果combineLatest() 中的两个可观察对象未在您的测试中定义,displayPaymentsLineItem$ 将不会发出任何内容。由于它们来自两个方面,因此可能需要在开始测试之前提供它们。

    另外,关于您的代码示例:

    1. displayPaymentsLineItem$ 没有在构造函数之前声明。
    2. selectedMobileDigitalBill$ 已声明,但在 combineLatest() 内部引用之前从未定义。

    【讨论】:

    • 代码也不是class.. :-)。我认为他给出了部分快照。
    • 如何将 combineLatest 中的两个 observable 添加到测试中?抱歉,基本问题...我是测试新手
    • 在这种情况下,您可以参考 Angular 关于测试组件基础知识的文章。他们还详细说明了如何设置模拟服务(这可能是设置这些可观察对象所需要的。)angular.io/guide/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-27
    • 2019-05-20
    • 1970-01-01
    • 2011-07-06
    • 1970-01-01
    • 2019-05-01
    • 1970-01-01
    相关资源
    最近更新 更多