歡迎您光臨本站 註冊首頁

angular元件間傳值測試的方法詳解

←手機掃碼閱讀     limiyoyo @ 2020-05-08 , reply:0

前言
我們知道angular元件間通訊有多種方法,其中最常用的一種方法就是藉助於 @Input 和 @Output 進行通訊。具體如何通訊請參考angular元件間通訊,本文不再贅述,我們來講講關於此方法如何進行單元測試。
建立假元件
我們單元測試父元件與子元件的的互動是否符合我們的要求,我們在父元件進行測試,就需要模擬一個假的子元件出來,這樣排除其他因素對測試的影響。
比如現在我在分頁元件裡寫了一個每頁大小選擇元件,現在要測試一下元件間互動。現在分頁元件就是我們的父元件,每頁大小元件就是我們的子元件。我們現在需要去模擬一個假的子元件出來。我們先模擬一個假模組出來。
我們的子元件在core模組裡,我們在core模組下創造一個core-testing模擬模組。再在core-testing模組下創造一個core元件,因為我們是一個模擬模組,我們只需要ts檔案即可。
@Component({ selector: 'app-size', template: `

size-select works!

`, styles: [] }) export class SizeComponent implements OnInit { constructor() { } ngOnInit() { } }
為了我們可以在父元件的測試檔案中得到模擬的子元件,我們還需要一個controller,在core-testing資料夾下建立一個core-testing-controller.ts檔案。CoreTestingController類繼承TestingController。
export class CoreTestingController extends TestingController { }
同時在我們的core-testing.module裡宣告CoreTestingController為提供者
providers: [ CoreTestingController ]
此時我們的目錄樹
core-testing git:(134) ✗ tree
.
├── core-testing-controller.ts
├── core-testing.module.ts
├── page
│ └── page.component.ts
└── size
└── size.component.ts
因為我們是模擬的子元件,所以我們應該新增子元件的@Input 和 @Output,同時在建構函式裡把這個模擬的子元件新增到CoreTestingController裡。
export class SizeComponent implements OnInit { @Input() size: number; @Output() onChangeSize = new EventEmitter

(); constructor(private controller: CoreTestingController) { this.controller.addUnit(this); } }
此時我們的準備工作就完成了。
單元測試
首先我們引入假元件並宣告提供者
import {CoreTestingController} from '../core-testing/core-testing-controller'; import {SizeComponent} from '../core-testing/size/size.component'; beforeEach(async(() => { TestBed.configureTestingModule({ declarations: [ PageComponent, SizeComponent ], imports: [FormsModule], providers: [ CoreTestingController ] }) .compileComponents(); }));
我你們這裡引入的是我們創造的假的SizeComponent,因為我們父元件與子元件在同一個模組裡,所以我們直接引入SizeComponent就可以。
此時我們父元件想要子元件時就會使用假的子元件。
我們先斷言@Input,我們斷言父元件的值與我們假的子元件值相等
it('選擇每頁大小', () => { const controller = TestBed.get(CoreTestingController) as CoreTestingController; const sizeComponent = controller.get(SizeComponent) as SizeComponent; expect(sizeComponent.size).toBe(component.size); });
我們這裡的get方法就對應的我們之前的建構函式的addUnit方法,具體參考TestingController類定義的方法。
然後我們再斷言子元件向父元件@Output也沒有問題,我們先spyon父元件接收子元件值的方法,然後定義一個變數並傳給父元件,然後斷言父元件接收到的值與子元件傳的值相同。
spyOn(component, 'onSizeSelected'); const emitSize = 4; sizeComponent.onChangeSize.emit(emitSize); expect(component.onSizeSelected).toHaveBeenCalledWith(4);
這時我們就達到了我們測試的目的。
我們啟動測試,發現我們本來的選擇下拉框變成了文字,這就是我們假的子元件的效果。
總結
我們進行單元測試,就需要除被測元件外,其他引用元件儘量為假,才能達到我們的目的。

[limiyoyo ] angular元件間傳值測試的方法詳解已經有299次圍觀

http://coctec.com/docs/program/show-post-233292.html