2017-04-20 109 views
0

我正在開發一個新項目,並將使用CLI生成應用程序和所有文件,但是我遇到了一些似乎對我和我都很不好的東西希望有一個更好的方法來做到這一點。Angular 2 CLI如何在所有規格中輕鬆包含RouterTestingModule

我的應用程序有路由,所以在我的測試中,我需要導入RouterTestingModule爲路由器提供模擬。但是,由於我們創建的每個規範都需要這個,所以如果在創建新組件時默認包含它,那將會非常好。我研究了對自定義藍圖的支持,但目前還沒有任何支持,這是一個無賴,因爲如果我可以將該模塊添加到藍圖中,這將非常簡單。

有什麼其他選項可以默認包含在所有規格中,而不需要每個開發人員在創建新組件時都記得添加它?

describe('LoginComponent',() => { 
    let component: LoginComponent; 
    let fixture: ComponentFixture<LoginComponent>; 

    beforeEach(async(() => { 
    TestBed.configureTestingModule({ 
     declarations: [ LoginComponent ], 
     imports: [ 
     RouterTestingModule, // I don't want to have to manually add this in every spec file. 
     SharedModule 
     ] 
    }) 
    .compileComponents(); 
    })); 

    beforeEach(() => { 
    fixture = TestBed.createComponent(LoginComponent); 
    component = fixture.componentInstance; 
    fixture.detectChanges(); 
    }); 

    it('should create',() => { 
    expect(component).toBeTruthy(); 
    }); 
}); 
+0

模塊上你所有的可重複使用的進口創建和它包括在這裏。 –

+0

我這樣做了,我在'SharedModule'內包含'RouterModule'的實際導入,你會看到我在導入規範。問題是在測試中我需要導入'RouterTestingModule'而不是'RouterModule'來讓測試運行。 – efarley

+0

好吧,它似乎不會傷害任何東西,包括'RouterTestingModule'到應用程序,而不是隻包括它在規格。 – efarley

回答

0

這聽起來很奇怪,每個組件都需要路由。路由應僅注入到智能第一級,第二級組件,其餘組件應該轉儲。

無論如何,如果你真的需要它,你CA創建一個接受TestModuleMetadata對象的函數,並注入所需的導入裏面像

createTestModule(moduleDef: TestModuleMetadata) { 
    let imports = [...(moduleDef.imports||[]), RouterTestingModule]; 
    return Object.assign({}, moduleDef, {imports}); 
} 
+0

我不在每個組件中包含路由。我將它包含在一個'SharedModule'中,然後導入到每個組件中。問題是這個導入是'RouterModule',而在規範中它變成'RouterTestingModule',所以規格需要額外的導入。我發現我可以將測試模塊導入到相同的共享模塊中,並且它看起來沒有任何傷害。 – efarley

相關問題