代码之家  ›  专栏  ›  技术社区  ›  Francesco

jasmine检查是否调用了私有方法

  •  0
  • Francesco  · 技术社区  · 7 年前

    我有一个角度服务公开了一个公共方法。在其主体内,可以根据条件调用两个不同的私有方法。

    如何根据传递给公共方法的输入参数检查是否调用了一个或另一个方法? 我知道我们不应该测试私有方法,但实际上,这里我只想验证公共方法是否调用了正确的私有方法。我不想公开私有方法,因为我只希望服务提供一个访问点。

    我的服务方法:

    public  addOrUpdateShoppingList(list: ShoppingList) {
      if (!list) {
        return Promise.reject("List object is null!");
      }
    
      if (!list.id) { 
        return this.createNewList(list);
      }
    
      return this.updatelist(list);
    }
    
    private createNewList(list: ShoppingList) {
      const id = this.db.createId();
      list.id = id;
      return this.db.collection<ShoppingList>(this.SHOPPING_LIST_COLLECTION)
                    .doc(id)
                    .set(list);
    }
    
    private updatelist(list: ShoppingList) {
      return this.db.collection<ShoppingList>(this.SHOPPING_LIST_COLLECTION)
                    .doc(list.id)
                    .update(list);
    

    }

    贾斯敏试验:

    it("addOrUpdateShoppingList should invoke createNewList() if the list doesn't have id.", () => {
    const service: DataService = TestBed.get(DataService);
    const mockedList: ShoppingList[] = [
      {
        id: null,
        isActive: true,
      }
     ];
    
    service.addOrUpdateShoppingList(newList);
    
    // I tried even with this "workaround", but it fails, even if the private method is accessed
    const sp = spyOn<any>(service, "createNewList").and.callThrough();
    expect(sp).toHaveBeenCalled();
    

    (});

    1 回复  |  直到 7 年前
        1
  •  0
  •   dmcgrandle    7 年前

    您不能直接测试私有方法——毕竟这是私有方法的要点:在定义它们的类之外看不到它们。对于一些解决方法,请参见 this StackOverflow question .

    但在你的情况下,你是幸运的。两个私有方法都调用数据库服务。只需监视该服务呼叫并测试通过的内容-您是否试图 set update -这将确定调用了哪个内部私有方法。

    快乐编码!