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

在Angular 2/Typescript中测试私有方法的最佳实践是什么

  •  -1
  • Arkadi  · 技术社区  · 7 年前

    我已经创建了Angular 5项目,并使用Karma、Jasmine编写了单元测试。我不喜欢将所有方法公开,只允许从测试中访问。

    export class AppComponent {
        mainMenu: any[];
    
        constructor(
            private menuService: MenuService
        ) {}
    
        ngOnInit(): void {
            this.initTable();
            this.initMenu();
        }
    
        private initTable(): void {
            // ... initializes array for table
        }
    
        private initMenu(): void {
            this.menuService.getMainMenu()
                .subscribe(data => this.mainMenu = data);
        }
    }
    

    initTable initMenu 方法只是划分代码并使其更有条理和可读性的助手,我不需要在中访问它们 public 模式但在这里,我面临着单元测试的问题,我的测试用例应该是这样的:

    it ('Should call menuService.getMainMenu', () => {
        spyOn(menuService, 'getMainMenu').and.returnValue(Observable.of([]));
    
        // this will throw exception
        component.initMenu();
    
        expect(menuService.getMainMenu).toHaveBeenCalled();
    });
    

    有什么想法吗?

    1 回复  |  直到 5 年前
        1
  •  0
  •   Ivan Mladenov    7 年前

    你可以通过公众来实现这一点 ngOnInit 方法而不是打电话 initMenu 在测试中,您可以调用 恩戈尼特 这间接地称为私人 初始化菜单

    it ('Should call menuService.getMainMenu', () => {
        spyOn(menuService, 'getMainMenu').and.returnValue(Observable.of([]));
    
        // this will throw exception
        component.ngOnInit();
    
        expect(menuService.getMainMenu).toHaveBeenCalled();
    });
    

    私有方法是私有的,这是有原因的。如果您有一个私有方法,它很复杂,需要对其进行测试,那么它是一种代码气味,表明您的代码有问题,或者该方法不应该是私有的