日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[转]Angular 单元测试讲解

發(fā)布時間:2023/12/4 编程问答 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [转]Angular 单元测试讲解 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

?

?

  • Angular_單元測試
    • 測試分類
      • 按開發(fā)階段劃分
      • 按是否運行劃分
      • 按是否查看源代碼劃分
      • 其他
    • ATDD,TDD,BDD,DDD
      • ATDD
      • TDD
      • BDD
      • DDD
    • Angular單元測試
      • Karma的介紹
      • jasmine介紹
      • 單元測試的好處
      • 使用jasmine和karma創(chuàng)建一個Angular項目
      • Karma配置
      • Test.ts文件
      • 測試體驗
      • 測試Form
      • 測試服務service
      • 常用斷言方法
      • Mock
        • Mock服務實例

?

?

?

Angular_單元測試

?

測試分類

?

?

按開發(fā)階段劃分

?

  • 單元測試
    單元測試又稱模塊測試,針對軟件設計中的最小單位——程序模塊,進行正確性檢查的測試工作。
  • 集成測試
    集成測試又叫組裝測試,通常在單元測試的基礎上,將所有程序模塊進行有序的、遞增測試。重點測試不同模塊的接口部分
  • 系統(tǒng)測試
    指的是將整個軟件系統(tǒng)看成一個整體進行測試,包括對功能、性能以及軟件所運行的軟硬件環(huán)境進行測試。
  • 驗收測試
    指按照項目任務書或合同、供需雙方約定的驗收依據(jù)文檔進行的對整個系統(tǒng)的測試與評審,決定是否接收或拒收系統(tǒng)

?

按是否運行劃分

?

  • 靜態(tài)測試
    是指不實際運行被測軟件,而只是靜態(tài)地檢查程序代碼、界面或文檔中可能存在的錯誤過程
  • 動態(tài)測試
    是指實際運行被測程序,輸入相應的測試數(shù)據(jù),檢查實際輸出結果和預期結果是否相符的過程。

?

按是否查看源代碼劃分

?

  • 黑盒測試
    指的是把被測的軟件看做一個黑盒子,不關心盒子里面的結構是什么樣子,只關心軟件的輸入數(shù)據(jù)和輸出數(shù)據(jù)。
  • 白盒測試
    指的是把盒子打開,去研究里面的源代碼和程序結構。

?

其他

?

  • 回歸測試
    是指軟件被修改后重新進行的測試,重復執(zhí)行上一個版本測試時的用例,是為了保證對軟件所做的修改沒有引入新的錯誤而重復進行的測試。
  • 冒煙測試
    是指在對一個新版本進行系統(tǒng)大規(guī)模的測試之前,先驗證一下軟件的基本功能是否實現(xiàn),是否具備可測性。
  • 隨機測試
    是指測試中所有的輸入數(shù)據(jù)都是隨機生成的,其目的是模擬用戶的真實操作,并發(fā)現(xiàn)一些邊緣性的錯誤。

?

ATDD,TDD,BDD,DDD

?

ATDD

?

ATDD: Acceptance Test Driven Development(驗收測試驅(qū)動開發(fā))

?

TDD 只是開發(fā)人員的職責,通過單元測試用例來驅(qū)動功能代碼的實現(xiàn)。在準備實施一個功能或特性之前,首先團隊需要定義出期望的質(zhì)量標準和驗收細則,以明確而且達成共識的驗收測試計劃(包含一系列測試場景)來驅(qū)動開發(fā)人員的TDD實踐和測試人員的測試腳本開發(fā)。面向開發(fā)人員,強調(diào)如何實現(xiàn)系統(tǒng)以及如何檢驗。

?

TDD

?

TDD: Test-driven development (測試驅(qū)動開發(fā))

?

是一種使用自動化單元測試來推動軟件設計并強制依賴關系解耦的技術。使用這種做法的結果是一套全面的單元測試,可隨時運行,以提供軟件可以正常工作的反饋。

?

測試驅(qū)動開發(fā)是敏捷開發(fā)中的一項核心實踐和技術,也是一種設計方法論。TDD的原理是在開發(fā)功能代碼之前,先編寫單元測試用例代碼,測試代碼確定需要編寫什么產(chǎn)品代碼。TDD的基本思路就是通過測試來推動整個開發(fā)的進行,但測試驅(qū)動開發(fā)并不只是單純的測試工作,而是把需求分析,設計,質(zhì)量控制量化的過程。TDD首先考慮使用需求(對象、功能、過程、接口等),主要是編寫測試用例框架對功能的過程和接口進行設計,而測試框架可以持續(xù)進行驗證。。

?

BDD

?

BDD:Behavior-Driven Development (行為驅(qū)動開發(fā))

?

行為驅(qū)動開發(fā)是一種敏捷軟件開發(fā)的技術,它鼓勵軟件項目中的開發(fā)者、QA和非技術人員或商業(yè)參與者之間的協(xié)作。主要是從用戶的需求出發(fā),強調(diào)系統(tǒng)行為。BDD最初是由Dan North在2003年命名,它包括驗收測試和客戶測試驅(qū)動等的極限編程的實踐,作為對測試驅(qū)動開發(fā)的回應。

?

?

DDD

?

DDD:領域驅(qū)動開發(fā)(Domain Drive Design)

?

DDD指的是Domain Drive Design,也就是領域驅(qū)動開發(fā),DDD實際上也是建立在這個基礎之上,因為它關注的是Service層的設計,著重于業(yè)務的實現(xiàn),將分析和設計結合起來,不再使他們處于分裂的狀態(tài),這對于我們正確完整的實現(xiàn)客戶的需求,以及建立一個具有業(yè)務伸縮性的模型。

?

Angular單元測試

?

Unit Test(單元測試)

?

?

對正式的項目進行單元測試是必須的,如果選擇使用TDD(測試驅(qū)動開發(fā))方法,則無關緊要,否則使用它將會產(chǎn)生很多好處。

?

在本文中,我們首先簡單地提到單元測試的好處,然后我們將創(chuàng)建一個Angular單元測試的完整示例,使用jasmine和karma。

?

Karma的介紹

?

Karma是Testacular的新名字,在2012年google開源了Testacular,2013年Testacular改名為Karma。Karma是一個讓人感到非常神秘的名字,表示佛教中的緣分,因果報應,比Cassandra這種名字更讓人猜不透!

?

Karma是一個基于Node.js的JavaScript測試執(zhí)行過程管理工具(Test Runner)。該工具可用于測試所有主流Web瀏覽器,也可集成到CI(Continuous integration)工具,也可和其他代碼編輯器一起使用。這個測試工具的一個強大特性就是,它可以監(jiān)控(Watch)文件的變化,然后自行執(zhí)行,通過console.log顯示測試結果。

?

jasmine介紹

?

TDD(Test Driven Development)測試驅(qū)動開發(fā),是敏捷開發(fā)中提出的最佳實踐之一。jasmine很有意思的提出了BDD(Behavior Driven Development)行為驅(qū)動開發(fā).

?

測試驅(qū)動開發(fā),對軟件質(zhì)量起到了規(guī)范性的控制。未寫實現(xiàn),先寫測試,一度成為Java領域研發(fā)的圣經(jīng)。隨著Javascript興起,功能越來越多,代碼量越來越大,開發(fā)人員素質(zhì)相差懸殊,真的有必要建立對代碼的規(guī)范性控制。jasmine就是為團隊合作而生。

?

Jasmine是一個用來編寫Javascript測試的框架,它不依賴于任何其它的javascript框架,也不需要對DOM。它有擁有靈巧而明確的語法可以讓你輕松的編寫測試代碼。

?

jasmine的結構很簡單:

?

describe("A suite", function() {var foo;beforeEach(function() {foo = 0;foo += 1;});afterEach(function() {foo = 0;});it("contains spec with an expectation", function() {expect(true).toBe(true);}); });

?

每個測試都在一個測試集中運行,Suite就是一個測試集,用describe函數(shù)封裝。 Spec表示每個測試用例,用it函數(shù)封裝。通過expect函數(shù),作為程序斷言來判斷相等關系。setup過程用beforeEach函數(shù)封裝,tearDown過程用afterEach封裝。

?

單元測試的好處

?

我們先來看看我認為在解決方案中使用單元測試的主要原因…

?

  • 改進實現(xiàn)的設計
    開始編寫一個功能而不給設計帶來太多的思考是開發(fā)人員非常常見的錯誤。使用單元測試將強制思考并重新考慮設計,如果您使用TDD,則影響會更大。

  • 允許重構
    既然你已經(jīng)有測試確保你所有的東西都能按預期工作,你可以很容易地添加對代碼的修改,確保你沒有添加任何錯誤。

  • 添加新功能而不會破壞任何內(nèi)容
    當您添加新功能時,您可以運行測試以確保您不會破壞應用程序的任何其他部分。

?

還有更多,但這三個在任何項目上都是如此巨大的勝利,對于我來說,這些贏利是封閉式的。但如果你不相信,讓我們再提幾個。

?

  • 測試是很好的文檔。
  • 測試使開發(fā)人員對他們的工作更有信心。

?

你可以說他們所有的好處都是以很高的成本來實現(xiàn)的,但是這完全是錯誤的。所有使用單元測試可能花費的時間與以后在您引入新功能或進行任何重構時要節(jié)省的時間相比將會很小。花在解決錯誤上的時間要比沒有使用單元測試時大大縮短。

?

我們將創(chuàng)建一個使用AngularJasmineKarma的應用程序的小而完整的例子。

?

這些是我們要談論的一些事情:

?

  • 解釋一下工具Karma和Jasmine
  • 解釋karma配置
  • 解釋test文件
  • 創(chuàng)建第一個簡單的測試,介紹Jasmine和Angular測試功能
  • 測試一個Angular form,介紹Jasmine和Angular測試功能
  • 測試一個帶服務的組件,介紹Angular測試功能

?

使用jasmine和karma創(chuàng)建一個Angular項目

?

正如Angular團隊建議我們要用Angular cli來創(chuàng)建我們的應用程序。通過這樣做,jasmine和karma的配置可以幫我們解決,比較方便。

?

安裝angular-cli并創(chuàng)建一個新項目:

?

  • npm install -g @angular/cli
  • ng new UnitTest –routing

?

當你創(chuàng)建項目時,所有的依賴關系都會安裝,包括你需要創(chuàng)建測試的所有東西。

?

"@types/jasmine": "~2.8.6","@types/jasminewd2": "~2.0.3","@types/node": "~8.9.4","codelyzer": "~4.2.1","jasmine-core": "~2.99.1","jasmine-spec-reporter": "~4.2.1","karma": "~1.7.1","karma-chrome-launcher": "~2.2.0","karma-coverage-istanbul-reporter": "~1.4.2","karma-jasmine": "~1.1.1","karma-jasmine-html-reporter": "^0.2.2",

?

  • jasmine-core:Jasmine是我們將用來創(chuàng)建測試的框架。它有許多功能可以讓我們編寫不同類型的測試。
  • karma:Karma是我們測試的任務跑步者。它使用配置文件來設置啟動文件,報告,測試框架,瀏覽器等等。
  • 其余依賴主要為記錄我們的測試,工具使用karma和jasmine和browser的發(fā)射器。

?

要運行測試,只需運行命令“ng test”。該命令將執(zhí)行測試,打開瀏覽器,顯示控制臺和瀏覽器報告,同樣重要的是,將測試執(zhí)行保留為監(jiān)視模式。也就是當我們修改過后,可以自動更新測試結果。

?

ng test

?

?

提示:如果想要終止,需要在終端內(nèi)按CTRL+C

?

Karma配置

?

讓我們來看看由angular-cli創(chuàng)建的karma配置文件。

?

// Karma configuration file, see link for more information // https://karma-runner.github.io/1.0/config/configuration-file.htmlmodule.exports = function (config) {config.set({basePath: '',frameworks: ['jasmine', '@angular-devkit/build-angular'],plugins: [require('karma-jasmine'),require('karma-chrome-launcher'),require('karma-jasmine-html-reporter'),require('karma-coverage-istanbul-reporter'),require('@angular-devkit/build-angular/plugins/karma')],client: {clearContext: false // leave Jasmine Spec Runner output visible in browser},coverageIstanbulReporter: {dir: require('path').join(__dirname, '../coverage'),reports: ['html', 'lcovonly'],fixWebpackSourcePaths: true},reporters: ['progress', 'kjhtml'],port: 9876,colors: true,logLevel: config.LOG_INFO,autoWatch: true,browsers: ['Chrome'],singleRun: false}); };

?

你大概可以猜到這些配置屬性的大部分用途,但我們來看看其中的一些。

?

  • frameworks:這是jasmine被設定為測試框架的地方。如果你想使用另一個框架,這是做這件事的地方。
  • reporters:負責將測試結果告知給開發(fā)者。通常是將結果打印到控制臺上,或者存入文件中
  • autoWatch:如果設置為true,則測試將以Watch模式運行。如果您更改任何測試并保存文件,測試將重新生成并重新運行。
  • browsers:這是您設置測試應該運行的瀏覽器的位置。默認情況下是chrome,但你可以安裝和使用其他瀏覽器啟動器。

?

Test.ts文件

?

karma的angular-cli配置使用文件“test.ts”作為應用程序測試的入口點。我們來看看這個文件;

?

// This file is required by karma.conf.js and loads recursively all the .spec and framework filesimport 'zone.js/dist/zone-testing'; import { getTestBed } from '@angular/core/testing'; import {BrowserDynamicTestingModule,platformBrowserDynamicTesting } from '@angular/platform-browser-dynamic/testing';declare const require: any;// First, initialize the Angular testing environment. getTestBed().initTestEnvironment(BrowserDynamicTestingModule,platformBrowserDynamicTesting() ); // Then we find all the tests. const context = require.context('./', true, /\.spec\.ts$/); // And load the modules. context.keys().map(context);

?

你可能永遠不需要改變這個文件,但是有時候還是會更改的,比如:某一個spec文件排除測試等。

?

測試體驗

?

我們來創(chuàng)建我們的第一個測試。修改app.component.ts。這個組件只有一個屬性“text”,其值為“Angular Unit Testing”,它是在HTML中的“h1”標記中呈現(xiàn)的,它還包含路由根元素和一些路由鏈接。讓我們創(chuàng)建一個測試文件來檢查組件是否實際具有該屬性,并且實際上是在HTML中呈現(xiàn)的。

?

app.component.html文件

?

<h1>{{text}}</h1> <router-outlet></router-outlet>

?

app.component.ts文件

?

import { Component } from '@angular/core';@Component({selector: 'app-root',templateUrl: './app.component.html',styleUrls: ['./app.component.css'] }) export class AppComponent {text = 'Angular Unit Testing'; }

?

app.component.spec.ts文件

?

import { TestBed, async } from '@angular/core/testing'; import { RouterTestingModule } from '@angular/router/testing'; import { AppComponent } from './app.component'; describe('AppComponent', () => {beforeEach(async(() => {TestBed.configureTestingModule({imports: [RouterTestingModule],declarations: [AppComponent],}).compileComponents();}));it('should create the app', async(() => {const fixture = TestBed.createComponent(AppComponent);const app = fixture.debugElement.componentInstance;expect(app).toBeTruthy();}));it(`should have as title 'app'`, async(() => {const fixture = TestBed.createComponent(AppComponent);const app = fixture.debugElement.componentInstance;expect(app.text).toEqual('Angular Unit Testing');}));it('should render title in a h1 tag', async(() => {const fixture = TestBed.createComponent(AppComponent);fixture.detectChanges();const compiled = fixture.debugElement.nativeElement;expect(compiled.querySelector('h1').textContent).toContain('Welcome to Angular Unit Testing!');})); });

?

此時執(zhí)行:

?

ng test

?

?

npm test

?

ng test的常用參數(shù).
- –code-coverage -cc 代碼覆蓋率報告, 默認這個是不開啟的, 因為生成報告的速度還是比較慢的.
- –colors 輸出結果使用各種顏色 默認開啟
- –single-run -sr 執(zhí)行測試, 但是不檢測文件變化 默認不開啟
- –progress 把測試的過程輸出到控制臺 默認開啟
- –sourcemaps -sm 生成sourcemaps 默認開啟
- –watch -w 運行測試一次, 并且檢測變化 默認開啟

?

在彈出的chrome瀏覽器窗口中顯示:

?

?

我們詳細介紹一下這個測試代碼

?

  • 導入測試文件的所有依賴項
    這里要注意,你在組件內(nèi)使用的依賴,這里面同樣需要導入,否則會無法運行。

  • 使用describe開始我們的測試

  • ?

    describe是一個函數(shù),Jasmine 就是使用 describe 全局函數(shù)來測試的。

    ?

    declare function describe(description: string, specDefinitions: () => void): void;

    ?

    表示分組類似測試套,也就是一組測試用例,支持description嵌套。

    ?

    例子:

    ?

    describe('測試顯示/隱藏篩選條件', ()=>{ })

    ?

  • 我們在每個之前使用異步。異步的目的是讓所有可能的異步代碼在繼續(xù)之前完成
  • Jasmine 就是使用 it 全局函數(shù)來表示,和 describe 類似,字符串和方法兩個參數(shù)。
    每個 Spec 內(nèi)包括多個 expectation 來測試需要測試的代碼,只要任何一個 expectation 結果為 false 就表示該測試用例為失敗狀態(tài)。
  • ?

    describe('demo test', () => {const VALUE = true;it('should be true', () => {expect(VALUE).toBe(VALUE);}) });

    ?

    如果有很多需要測試的,可以多個it:

    ?

    describe('AppComponent', () => {beforeEach(async(() => {TestBed.configureTestingModule({imports: [RouterTestingModule],declarations: [AppComponent],}).compileComponents();}));it('should create the app', async(() => {const fixture = TestBed.createComponent(AppComponent);const app = fixture.debugElement.componentInstance;expect(app).toBeTruthy();})); });

    ?

    斷言,使用 expect 全局函數(shù)來表示,只接收一個代表要測試的實際值,并且需要與 Matcher 代表期望值

    ?

  • TestBed可以幫助我們創(chuàng)建app實例
  • 代碼中有3個it

    • 第一個為異步測試app是否true或false
      如果app是0;兩次取反當然是false;
      如果app是null;兩次取反是false;
      如果app是undefined;兩次取法是false;
      其余的,兩次取反是true;

    • 第二個為異步測試app是否有text屬性,并且判斷值是否和預期相同

    • 第三個為異步測試app是否在h1標簽中的顯示值為預期值
  • ?

    測試Form

    ?

  • 創(chuàng)建一個contact組件。
  • ?

    ng g c contact

    ?

  • 首先我們修改contact.component HTML文件
  • ?

    <div>{{text}}</div><form id="contact-form" [formGroup]="contactForm" (ngSubmit)="onSubmit()" novalidate><div class="form-group"><label class="center-block">Name:<input class="form-control" formControlName="name"></label><label class="center-block">Email:<input class="form-control" formControlName="email"></label><label class="center-block">Text:<input class="form-control" formControlName="text"></label></div><button type="submit"[disabled]="!contactForm.valid" class="btn btn-success">Save</button></form>

    ?

    這很簡單,針對代碼不做任何解釋了。

    ?

  • 修改contact.component.ts文件
  • ?

    import { Component, OnInit } from '@angular/core'; import { FormGroup, FormControl, Validators } from '@angular/forms';@Component({selector: 'app-contact',templateUrl: './contact.component.html',styleUrls: ['./contact.component.css'] }) export class ContactComponent {text = 'contact page';contactForm: FormGroup;contact = {name: '',email: '',text: ''};submitted = false;constructor() {this.createForm();}createForm(): void {this.contactForm = new FormGroup({'name': new FormControl(this.contact.name, [Validators.required,Validators.minLength(4)]),'email': new FormControl(this.contact.email, [Validators.required,Validators.email]),'text': new FormControl(this.contact.text, Validators.required)});}onSubmit(): void {this.submitted = true;} }

    ?

    這個組件也很容易理解。 onSubmit提交函數(shù)只是將提交的屬性更改為true。

    ?

  • 修改app-routing.module.ts
  • ?

    import { ContactComponent } from './contact/contact.component'; import { NgModule } from '@angular/core'; import { Routes, RouterModule } from '@angular/router';const routes: Routes = [{path: '',redirectTo: 'contact',pathMatch: 'full'},{path: 'contact',component: ContactComponent} ];@NgModule({imports: [RouterModule.forRoot(routes)],exports: [RouterModule] }) export class AppRoutingModule { }

    ?

    此時終端執(zhí)行:

    ?

    npm start

    ?

    ?

  • 修改測試文件contact.component.spec.ts
  • ?

    import { BrowserModule, By } from '@angular/platform-browser'; import { async, ComponentFixture, TestBed } from '@angular/core/testing';import { ContactComponent } from './contact.component'; import { DebugElement } from '@angular/core'; import { FormsModule, ReactiveFormsModule } from '@angular/forms';describe('ContactComponent', () => {let comp: ContactComponent;let fixture: ComponentFixture<ContactComponent>;let de: DebugElement;let el: HTMLElement;beforeEach(async(() => {TestBed.configureTestingModule({declarations: [ContactComponent],imports: [BrowserModule,FormsModule,ReactiveFormsModule]}).compileComponents().then(() => {fixture = TestBed.createComponent(ContactComponent);comp = fixture.componentInstance;de = fixture.debugElement.query(By.css('form'));el = de.nativeElement;});}));it(`should have as text 'contact page'`, async(() => {expect(comp.text).toEqual('contact page');}));it('should set submitted to true', async(() => {comp.onSubmit(); // 直接內(nèi)部調(diào)用onSubmit函數(shù), submitted被更改為trueexpect(comp.submitted).toBeTruthy();}));it('form call the onSubmit method', async(() => {fixture.detectChanges();spyOn(comp, 'onSubmit');el = fixture.debugElement.query(By.css('button')).nativeElement;el.click(); // 模擬在html界面上點擊onSubmit,此時是不能被點擊的,因為沒有輸入,所以次數(shù)應該是0expect(comp.onSubmit).toHaveBeenCalledTimes(0);}));it('form should be invalid', async(() => {comp.contactForm.controls['email'].setValue('');comp.contactForm.controls['name'].setValue('');comp.contactForm.controls['text'].setValue('');expect(comp.contactForm.valid).toBeFalsy();}));it('form should be vaild', async(() => {comp.contactForm.controls['email'].setValue('asd@asd.com');comp.contactForm.controls['name'].setValue('aada');comp.contactForm.controls['text'].setValue('text');expect(comp.contactForm.valid).toBeTruthy();})); });

    ?

    此時執(zhí)行:

    ?

    ng test

    ?

    ?

    我們來分析一下,這個測試文件做了哪些東西?

    ?

    • 導入依賴模塊BrowserModule,FormsModule,ReactiveFormsModule
    • 使用”By”將DOM中的form導入進來
    • 第一個測試text屬性
    • 測試onSubmit函數(shù)調(diào)用
    • 第三個測試使用“fixture”對象的函數(shù)“detectChanges”將組件狀態(tài)應用于HTML,然后從DOM獲取提交按鈕并觸發(fā)單擊事件。在此之前,我們在組件的“onSubmit”功能上創(chuàng)建一個jasmine “spy”。最后,我們期望onSubmit函數(shù)不會被執(zhí)行,因為這個按鈕應該被禁用,因為表單無效。
    • 第四個測試將無效值設置為組件表單,并期望表單有效屬性為false。
    • 最后,在第五個測試中,我們將有效值設置為表單并期望表單有效屬性為真。

    ?

    小提示
    - detectChanges
    在測試中的Angular變化檢測。每個測試程序都通過調(diào)用fixture.detectChanges()來通知Angular執(zhí)行變化檢測。
    - By
    By類是Angular測試工具之一,它生成有用的predicate。 它的By.css靜態(tài)方法產(chǎn)生標準CSS選擇器 predicate,與JQuery選擇器相同的方式過濾。

    ?

    測試服務service

    ?

    當你要測試一個帶有服務的組件時,就像我們已經(jīng)看到的那樣,你需要將提供者添加到在“beforeEach”中創(chuàng)建的測試模塊。事情是,你可能不想使用實際的服務,而是一個模擬版本,所以讓我們看看如何做到這一點……

    ?

  • 創(chuàng)建一個app.service服務
  • ?

    ng g s app

    ?

  • 修改app.service.ts
  • ?

    import { Injectable } from '@angular/core';@Injectable({providedIn: 'root' }) export class AppService {constructor() { }getInfo(): string {return 'test service';} }

    ?

  • 修改app.component.ts
  • ?

    import { AppService } from './app.service'; import { Component } from '@angular/core';@Component({selector: 'app-root',templateUrl: './app.component.html',styleUrls: ['./app.component.css'] }) export class AppComponent {text = 'Angular Unit Testing';info: string;constructor(private service: AppService) {this.info = this.service.getInfo();} }

    ?

  • 在app.component.spec.ts內(nèi)增加
    注意引入AppService服務。
  • ?

    ...providers: [AppService] ...it('should have as info test service', async(() => {const fixture = TestBed.createComponent(AppComponent);const app = fixture.debugElement.componentInstance;expect(app.info).toEqual('test service');}));

    ?

  • 修改app.service.spec.ts
  • ?

    import { TestBed, inject, async } from '@angular/core/testing';import { AppService } from './app.service';describe('AppService', () => {beforeEach(() => {TestBed.configureTestingModule({providers: [AppService]});});it('should be created', inject([AppService], (service: AppService) => {expect(service).toBeTruthy();}));it('should getInfo test service', inject([AppService], (service: AppService) => {expect(service.getInfo()).toEqual('test service');})); });

    ?

    此時執(zhí)行:

    ?

    ng test

    ?

    測試全部通過。

    ?

    小提示
    有些時候我們希望不是異步的,這時需要使用takeAsync函數(shù),fakeAsync最重要的好處是測試程序看起來像同步的。

    ?

    it('should show quote after getQuote promise (fakeAsync)', fakeAsync(() => {fixture.detectChanges();tick(); // wait for async getQuotefixture.detectChanges(); // update view with quoteexpect(el.textContent).toBe(testQuote); }));

    ?

    常用斷言方法

    ?

    Jasmine 提供非常豐富的API,一些常用的Matchers:

    ?

    • toBe() 等同 ===
    • toNotBe() 等同 !==
    • toBeDefined() 等同 !== undefined
    • toBeUndefined() 等同 === undefined
    • toBeNull() 等同 === null
    • toBeTruthy() 等同 !!obj
    • toBeFalsy() 等同 !obj
    • toBeLessThan() 等同 <
    • toBeGreaterThan() 等同 >
    • toEqual() 相當于 ==
    • toNotEqual() 相當于 !=
    • toContain() 相當于 indexOf
    • toBeCloseTo() 數(shù)值比較時定義精度,先四舍五入后再比較。
    • toHaveBeenCalled() 檢查function是否被調(diào)用過
    • toHaveBeenCalledWith() 檢查傳入?yún)?shù)是否被作為參數(shù)調(diào)用過
    • toMatch() 等同 new RegExp().test()
    • toNotMatch() 等同 !new RegExp().test()
    • toThrow() 檢查function是否會拋出一個錯誤

    ?

    而這些API之前用 not 來表示負值的判斷。

    ?

    expect(true).not.toBe(false);

    ?

    這些Matchers幾乎可以滿足我們?nèi)粘P枨?#xff0c;當然你也可以定制自己的Matcher來實現(xiàn)特殊需求。

    ?

    Mock

    ?

    在實際的組件測試中發(fā)現(xiàn)組件往往依賴于服務。而服務又依賴于外部資源如http交互、本地資源等。為了屏蔽外部依賴方便組件的測試,可以對服務進行mock。對于服務的mock方式有兩種:偽造服務實例(提供服務復制品)、刺探真實服務。這兩種方式都能夠達到mock的效果,我們可以挑選一種最適合自己當前測試文件的測試方式來進行測試。

    ?

    Mock服務實例

    ?

    第一步:編寫服務的mock類

    ?

    class TaskMonitorStubService extends TaskMonitorService {public queryTaskList(request: ViewTaskRequest): Observable<any> {return request.code === -1 ? Observable.of(runningTaskResponse): Observable.of(finishedTashResponse)} }

    ?

    第二步:在configureTestingModule用Mock的服務替換真實的服務

    ?

    TestBed.configureTestingModule({imports: [HttpModule,TaskMonitorModule],Providers: [{provide: TaskMonitorService, useClass: TaskMonitorStubService}] })

    ?

    刺探真實服務

    ?

    Angular的服務都是通過注入器注入到系統(tǒng)中的,同樣我們可以從根TestBed獲取到注入服務的實例,然后結合刺探(Spy)對真實的服務的方法進行替換.

    ?

    let taskMonitorService: TaskMonitorService = TestBe.get(TaskMonitorService); spyOn(taskMonitorService, 'queryTaskList').and.returnValue(Observable.of(runningTaskResponse));


    ---------------------
    作者:FlyWine
    來源:CSDN
    原文:https://blog.csdn.net/wf19930209/article/details/80413904
    版權聲明:本文為作者原創(chuàng)文章,轉載請附上博文鏈接!

    總結

    以上是生活随笔為你收集整理的[转]Angular 单元测试讲解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

    日韩电影中文字幕 | 日日干av | 国产成人精品免高潮在线观看 | 99久久夜色精品国产亚洲96 | 国产精品一区二区久久国产 | 天天干夜夜 | 久久精品国产一区二区三区 | 国产一区二区影院 | 久久综合九色综合久99 | 最新日韩在线 | 射九九| 日韩成人精品在线观看 | 久久成 | 国产专区视频在线观看 | 少妇搡bbbb搡bbb搡aa | 色婷婷www| 18女毛片 | 亚洲午夜精品在线观看 | 日韩毛片在线免费观看 | 日本女人逼 | 国产成人精品三级 | 日操操 | 嫩模bbw搡bbbb搡bbbb | 久久国产电影院 | 欧美在线a视频 | 久草网视频在线观看 | 81国产精品久久久久久久久久 | 综合久久2023| 精品久久久久久亚洲综合网 | 欧美一区二区三区在线视频观看 | av在线激情| 免费观看一区二区 | 成人网页在线免费观看 | 欧美精品久久久 | 国内精品久久天天躁人人爽 | 正在播放国产一区二区 | 天堂黄色片| 狠狠地操 | 一级黄色电影网站 | 在线观看亚洲国产 | 久久99精品国产91久久来源 | 久久久久久久久久久久久久av | 91av在线视频播放 | 色在线免费视频 | 日韩国产精品毛片 | 成年人免费在线观看 | 国产精品 中文字幕 亚洲 欧美 | av在线播放快速免费阴 | 日韩av二区 | 91一区二区三区在线观看 | 九九久久国产精品 | 国产精品一区久久久久 | 日韩精品免费在线观看 | 欧美综合久久久 | 久久精品香蕉 | 国产日本亚洲 | 日韩r级在线 | 亚洲五月婷 | 综合色站导航 | 在线观看日韩中文字幕 | 欧美一级片免费在线观看 | 在线观看亚洲专区 | 69欧美视频 | 国产一级黄色电影 | 国产韩国日本高清视频 | 97在线视频免费观看 | 国产原厂视频在线观看 | 免费成人黄色片 | 日韩欧美国产视频 | 免费高清在线观看成人 | 99r在线视频 | 成人免费亚洲 | 91桃花视频 | 天天操操操操操操 | 91成人精品观看 | 最近中文字幕第一页 | 天堂中文在线播放 | 97视频在线观看成人 | 91看片在线播放 | 大片网站久久 | 高清一区二区三区av | 久久亚洲私人国产精品 | 久久国产区 | 99久久www | 亚洲精品欧美精品 | 成人四虎 | 国际精品网 | 中文字幕123区| 欧美国产日韩一区二区三区 | 91精品国产乱码 | 欧美久久久久久久久久久 | 国产精品一区二区在线观看免费 | 国产成人av电影在线观看 | 国产乱对白刺激视频在线观看女王 | 久久99国产精品久久99 | 久久久久女教师免费一区 | 成人av免费 | 久久久在线视频 | 国产麻豆果冻传媒在线观看 | 国产一区视频导航 | 久久超碰网 | 亚洲精品麻豆 | 午夜av大片 | 久久久精品国产免费观看一区二区 | 在线色亚洲 | 九九热免费在线视频 | 中文伊人 | 久草青青在线观看 | 韩日精品在线观看 | 青青啪 | 最新不卡av | 久久久www成人免费毛片麻豆 | 久久久久久久久久久久久久电影 | 久久综合久久久久88 | 久久成人国产精品入口 | 精品久久久久久亚洲综合网 | 三级小视频在线观看 | 久久电影网站中文字幕 | 91中文在线 | 欧美亚洲xxx | 狠狠狠色 | 在线观看视频黄 | 免费视频97| 国产亚洲在线观看 | 亚洲 综合 激情 | 国产精品国产三级国产aⅴ9色 | 中文字幕在线观看网 | 色吧av色av | 超碰在线官网 | 亚洲午夜不卡 | 国产又黄又爽又猛视频日本 | 国产韩国日本高清视频 | a特级毛片| 狠狠狠干 | 国产精品一区二区电影 | 亚洲精品97 | 久久九九影视 | 狠狠色噜噜狠狠狠狠 | 国产中文视 | 午夜精品在线看 | 欧美一区在线观看视频 | 91喷水| 欧美男女爱爱视频 | 国产精品久久久久一区二区三区 | 探花在线观看 | 久久精品欧美一区二区三区麻豆 | 69视频国产 | 久久久www免费电影网 | 日本xxxxav | 久久激情片 | 欧美性色19p| 亚洲永久精品在线观看 | 一本色道久久精品 | 久久精品99国产精品 | 黄色在线观看免费 | 中文字幕av全部资源www中文字幕在线观看 | 免费在线观看黄网站 | 在线播放 亚洲 | 国产不卡av在线播放 | 亚洲免费在线视频 | 美女av免费 | 国产首页 | 亚洲狠狠丁香婷婷综合久久久 | 欧美精品一区二区蜜臀亚洲 | 激情综合六月 | 亚洲开心色 | 免费三级大片 | 中文字幕一区二区三区在线播放 | 九九有精品 | 国产精品夜夜夜一区二区三区尤 | 国产视频久 | 丁香婷婷色综合亚洲电影 | 国产精品理论片在线观看 | 91视频在线观看下载 | 婷婷六月激情 | 丁香六月伊人 | 久久久久久国产精品久久 | 久久视了| 91麻豆精品国产91久久久无需广告 | 五月婷婷在线综合 | 婷婷色网站 | 日本在线观看一区 | 国产精品乱码一区二三区 | 久草免费资源 | 区一区二区三区中文字幕 | 国产一级二级在线 | 成人久久亚洲 | 操操操av | 国产精品永久免费观看 | 高清免费在线视频 | 久久香蕉一区 | 日韩一级黄色片 | 色网免费观看 | 狠狠操操操 | 麻豆系列在线观看 | 亚洲午夜精品电影 | 欧美久久久久久久久久久 | 久久视频在线观看中文字幕 | 久久久免费毛片 | 欧美特一级片 | 免费看毛片网站 | 国产精品国产自产拍高清av | 狠狠狠色丁香综合久久天下网 | 久久成人免费 | 国产美腿白丝袜足在线av | 精品国产一区二区三区日日嗨 | 伊人久久国产精品 | 欧美性猛片 | 日本系列中文字幕 | 国产v视频| 91热爆在线观看 | 国产高清不卡av | 日韩av电影网站在线观看 | 色综合天天色 | 色爱区综合激月婷婷 | 久久av免费电影 | 成人香蕉视频 | 国产亚洲精品电影 | 91麻豆国产福利在线观看 | 天天撸夜夜操 | 欧美日韩国产成人 | 欧美成人日韩 | 日本乱视频 | 天天插天天射 | 婷婷色六月天 | 欧美污在线观看 | 九九激情视频 | 国产视频 亚洲精品 | 成人久久精品 | 在线观看av麻豆 | 综合网伊人 | 五月天中文字幕mv在线 | 国产视频丨精品|在线观看 国产精品久久久久久久久久久久午夜 | 最近中文字幕mv免费高清在线 | 免费精品视频在线 | 一区二区三区在线看 | 久久综合久久久 | 网址你懂的在线观看 | 日本精品视频一区二区 | 在线观看的黄色 | 2020天天干夜夜爽 | 久草在线在线精品观看 | 欧美极品xxxx| 久久一区二区三区国产精品 | 日韩va在线观看 | 激情婷婷 | 99性视频 | 国产精品久久久久久久久久久久冷 | 国产欧美在线一区二区三区 | 国产在线一区二区 | 综合网成人 | 婷婷久月| 成人av影视观看 | 丁香六月天 | 激情丁香综合 | 免费黄色在线网址 | www.黄色小说.com| 91午夜精品 | 久免费 | 99精品视频在线播放免费 | 伊人天天干 | 天天爱天天操天天干 | 在线视频 一区二区 | 欧美一区二区三区在线播放 | 99精品系列| 超碰97在线资源 | 黄色片网站 | 狠狠操在线 | 久草精品视频在线播放 | 中文字幕韩在线第一页 | av电影中文字幕在线观看 | 国产精品精品久久久久久 | 国产视频精选 | 精品9999| 国产精品一区二区三区久久 | 久久久久久久久影院 | 久久精品男人的天堂 | 国产在线观看你懂的 | 在线亚洲精品 | 中文字幕在线观看免费高清完整版 | 国产精品精品久久久久久 | 婷婷视频在线播放 | 日韩在线观看影院 | 亚洲韩国一区二区三区 | 婷婷色伊人| 国产亚洲高清视频 | 2024国产精品视频 | 欧美日韩免费一区 | 亚洲精品无 | 在线91精品 | av在线日韩| 一区二区三区电影 | 亚洲日日日 | 国产黄色a | 日韩av二区 | 偷拍福利视频一区二区三区 | 欧美孕妇与黑人孕交 | 久久精品99国产精品酒店日本 | 99久久精品电影 | 91视频免费网站 | 亚洲1区 在线 | 欧美在线观看小视频 | 五月天com | 久热久草 | 国产手机在线观看视频 | 黄色免费高清视频 | 亚洲在线成人精品 | 亚洲国产免费看 | 国产福利精品在线观看 | 久草在线免费资源站 | 欧美精品国产综合久久 | 五月天激情视频在线观看 | 成人宗合网 | 亚洲一区二区三区四区精品 | 久久亚洲影院 | 久久久久亚洲精品中文字幕 | 9在线观看免费高清完整版在线观看明 | 日韩欧美在线免费 | 99精品在线免费在线观看 | 日韩高清片 | 特级黄色片免费看 | 亚洲精品乱码久久久久久蜜桃不爽 | 人人舔人人舔 | 一区二区av | 亚洲区另类春色综合小说 | 五月婷婷激情五月 | 免费在线播放av电影 | 国产精品一码二码三码在线 | 久久婷婷开心 | 久久视频在线视频 | 人人干免费 | 欧美大片在线观看一区 | 特黄特黄的视频 | 亚洲少妇激情 | 国产精品毛片久久久久久久久久99999999 | 天天做天天爱天天爽综合网 | 久热香蕉视频 | 亚洲首页 | 国产高清av免费在线观看 | 国产精品嫩草影视久久久 | 又黄又刺激视频 | 久久久国产成人 | 夜夜操夜夜干 | 国产99久久久久 | 国产美女视频一区 | a视频在线观看免费 | 日日夜夜草 | 97人人模人人爽人人喊中文字 | 超碰人人超 | 亚洲精品国偷拍自产在线观看 | 国产精品一区二区白浆 | 日韩精品中文字幕一区二区 | 国产又黄又猛又粗 | 黄av资源| 日韩二区三区在线观看 | 色婷婷亚洲 | 国产成人精品免费在线观看 | 午夜视频在线网站 | 久久精品免费播放 | 狠狠躁夜夜躁人人爽视频 | 国产精品夜夜夜一区二区三区尤 | 婷婷深爱五月 | 国产91精品一区二区麻豆网站 | 97操操操 | 亚洲va欧美va | 欧美精品做受xxx性少妇 | 激情五月在线 | 国产1区2区3区在线 亚洲自拍偷拍色图 | 久久怡红院 | 97视频总站 | 久久99精品国产99久久 | 亚洲最新精品 | 日本精品小视频 | 一级免费看 | 黄色av一区二区 | 免费成人av | 精品一区二区三区在线播放 | 丁香婷婷综合色啪 | 日韩精品无码一区二区三区 | 午夜三级理论 | 欧美成a人片在线观看久 | 一区二区毛片 | 少妇自拍av | 精品亚洲一区二区 | 在线国产日韩 | 亚洲国产精品免费 | 欧美在线视频一区二区三区 | 日韩综合一区二区三区 | 亚洲视频 一区 | 欧美一级日韩免费不卡 | 2023年中文无字幕文字 | 国产精品第一视频 | 国产精品免费不卡 | 色婷婷www| 福利网址在线观看 | 天天操夜夜操国产精品 | 黄色av电影免费观看 | 欧美精品久久久久久 | 亚洲精品久久久蜜桃 | 少妇高潮冒白浆 | 午夜久久久久 | 欧美一区免费在线观看 | 国产在线播放一区二区三区 | 欧美天堂影院 | 亚洲精欧美一区二区精品 | 国产精彩在线视频 | 久久久五月婷婷 | 国产一二三区av | 91日韩精品一区 | 日韩视频免费播放 | 国产夫妻自拍av | 国产日产亚洲精华av | 999国内精品永久免费视频 | 婷婷丁香九月 | 久久福利影视 | 日韩欧美一级二级 | 久草在线手机视频 | 好看av在线 | av高清不卡 | 探花视频在线版播放免费观看 | 丁香婷婷网 | 日韩三区在线 | 国产精品专区在线 | 人人澡人摸人人添学生av | 免费在线国产 | 亚洲精品动漫在线 | 久久国产一区 | 免费中文字幕 | 日韩在线观看高清 | 日韩区欠美精品av视频 | 狠狠做深爱婷婷综合一区 | 婷婷综合激情 | 国产高清免费视频 | 日韩av在线小说 | 久久综合网色—综合色88 | 国产一级片一区二区三区 | 黄色性av | 亚洲精品高清一区二区三区四区 | 国产又黄又爽又猛视频日本 | 日韩视频区 | 久久久91精品国产一区二区精品 | 久久8| 久久久久久久久久久久久久免费看 | 日韩最新在线视频 | 欧美性色综合网站 | 国产精品中文在线 | 亚洲一区网 | 最新日本中文字幕 | 99久久这里有精品 | 在线观看免费成人 | 97免费在线观看 | 国产黑丝袜在线 | 色婷婷欧美 | 亚洲成人资源在线观看 | 探花视频免费观看高清视频 | 久久高视频 | 久久精品91久久久久久再现 | www·22com天天操 | 国产精品短视频 | 中文有码在线视频 | 国产精品久久久av久久久 | h文在线观看免费 | 国产精品第一视频 | 久久久亚洲网站 | 一本一本久久a久久 | 夜夜躁日日躁狠狠久久88av | 成人亚洲网 | 99精品视频网站 | 玖玖色在线观看 | 毛片美女网站 | av东方在线 | 欧美日韩国产在线 | 久久久免费观看 | 日韩免费一二三区 | 免费观看全黄做爰大片国产 | 一级黄色片在线免费观看 | 国产精品va最新国产精品视频 | 在线视频在线观看 | 婷婷精品国产欧美精品亚洲人人爽 | 99精品免费 | 在线观看麻豆av | 手机在线黄色网址 | 国产无吗一区二区三区在线欢 | 国产大陆亚洲精品国产 | 色小说在线 | 日本精品一区二区三区在线播放视频 | 免费的黄色的网站 | 天天爽天天搞 | 国产一在线精品一区在线观看 | 国产精品18毛片一区二区 | 色综合网在线 | 97在线观看视频 | 欧美日韩不卡在线观看 | 天天摸天天干天天操天天射 | 免费午夜视频在线观看 | 婷婷丁香在线 | 国产视频在线免费 | 日本在线观看中文字幕无线观看 | 91精品国产综合久久福利 | 婷婷久久一区 | 丁香九月婷婷综合 | 丁香婷婷综合激情五月色 | 国产手机在线观看 | 在线看一区 | 免费的成人av | 精品国精品自拍自在线 | 亚洲精品视频免费在线观看 | 亚洲在线色 | 国产99久久精品 | 99热999| 五月婷香蕉久色在线看 | 亚洲国产日韩一区 | 久久精品三级 | 成人免费观看完整版电影 | 天天爽天天做 | 少妇bbbb搡bbbb搡bbbb | 日韩一级精品 | 亚洲人成在| 九九有精品 | 一区二区亚洲精品 | 97高清视频| 在线观看成人网 | 91高清免费看 | 麻豆传媒在线视频 | 成人黄色大片在线观看 | 免费91在线观看 | 狠狠精品 | 超碰在线cao | 日本中文字幕久久 | 亚洲精品一区二区18漫画 | 欧美伊人网| 国产精品久久久久毛片大屁完整版 | 成人av资源站 | 久久er99热精品一区二区 | 91精品免费视频 | 日韩色高清 | 91精品久久久久久久99蜜桃 | 俺要去色综合狠狠 | 最新国产精品拍自在线播放 | 91日韩精品视频 | 色视频在线看 | 色视频在线观看免费 | 成年人看片 | 日韩a在线| 国产黄色大片 | 亚洲精品国产自产拍在线观看 | 最近日本中文字幕a | 国产精品精品久久久久久 | 黄色软件网站在线观看 | www,黄视频 | 久草在线 | 国产最顶级的黄色片在线免费观看 | 久青草电影 | 日韩一级网站 | 国产免费久久精品 | 深爱婷婷激情 | 欧美日韩在线免费视频 | 日韩三级免费 | 五月天电影免费在线观看一区 | 黄色资源在线 | 在线观看免费版高清版 | 六月丁香婷婷久久 | 激情网在线视频 | 黄色特一级片 | 视频在线观看入口黄最新永久免费国产 | 91大神精品视频在线观看 | 悠悠av资源片 | 四虎www com | 久久午夜国产精品 | 男女靠逼app | 色婷婷丁香 | 亚洲国产成人精品久久 | 一区二区三区高清 | 国产成人高清 | 中文视频在线 | 久久综合导航 | 91成人精品在线 | 夜夜夜草 | 久久夜色精品国产欧美乱极品 | 91看片黄色| 婷婷av网 | 午夜精品视频在线 | 欧美做受高潮电影o | 国产中文自拍 | 国产精品精品国产色婷婷 | 久久精品免费播放 | 亚洲mv大片欧洲mv大片免费 | 日本不卡123 | 国产96在线观看 | 97视频在线免费观看 | 欧美91在线 | 国产精品va视频 | 久久久久久蜜桃一区二区 | 96精品视频 | 久久综合精品一区 | www.久久久com | 丁香九月激情 | 国产综合福利在线 | 一级国产视频 | 正在播放一区 | 国产精品99久久久久久大便 | 亚洲国产中文字幕在线视频综合 | 午夜精品电影 | 一区二区三区动漫 | 精品女同一区二区三区在线观看 | 中文字幕不卡在线88 | 天天夜夜操 | 中文字幕在线国产 | 久久天天躁狠狠躁亚洲综合公司 | 一本一本久久a久久精品综合妖精 | 天天射天天干 | 丁香六月天婷婷 | 免费看十八岁美女 | 黄色成人小视频 | 安徽妇搡bbbb搡bbbb | 人人插人人搞 | 国产免费又黄又爽 | 欧美色黄 | 国产色区| 欧美久久久影院 | 精品福利视频在线观看 | 青青河边草观看完整版高清 | 亚洲欧美激情插 | 亚洲国产中文字幕在线观看 | 亚洲久草网 | 视频在线在亚洲 | 在线观看亚洲免费视频 | 午夜丁香视频在线观看 | av在线成人| 综合在线色 | 五月宗合网 | 五月激情在线 | 日韩资源在线播放 | 精品天堂av| 黄色中文字幕在线 | 丁香六月伊人 | 成年人在线看片 | 激情电影影院 | 日本激情视频中文字幕 | 国产视频丨精品|在线观看 国产精品久久久久久久久久久久午夜 | 久久天天操 | 九九久久影院 | 91精品资源| 一区二区日韩av | 婷婷亚洲综合五月天小说 | 亚洲va欧美va| 最新真实国产在线视频 | 婷婷久久国产 | 女人魂免费观看 | 不卡av免费在线观看 | 香蕉视频在线免费 | 成人在线视频免费 | 超碰97在线资源 | 国产免费一区二区三区网站免费 | 国产精品手机看片 | 蜜臀av夜夜澡人人爽人人 | 日韩欧美精品一区 | 亚洲精品国产免费 | 久久国产二区 | 婷婷亚洲五月 | 美女性爽视频国产免费app | 亚洲精品合集 | 国产精品24小时在线观看 | 成人av电影免费在线播放 | 日韩欧美一区二区三区在线 | 天天搞天天干天天色 | 久久av高清 | 精品国产一区二区三区四 | 国产成人精品免高潮在线观看 | 四虎国产免费 | 成人毛片在线观看 | www黄色软件 | 日韩高清网站 | 天天干天天干天天干 | 国产最新在线视频 | 亚洲免费专区 | 日韩精品一区二区三区第95 | 免费看黄在线看 | 人人干在线观看 | 国产福利av在线 | 手机av资源 | 欧美日韩久久久 | 最近中文字幕免费av | 手机色在线 | 最近中文字幕完整视频高清1 | 成人三级视频 | 麻豆传媒在线免费看 | 亚洲电影第一页av | 日本激情动作片免费看 | 性色xxxxhd | 最近日本韩国中文字幕 | 国产在线观看二区 | 亚洲国产黄色片 | 国产不卡在线观看视频 | 欧美日韩国产伦理 | 精品福利网 | av在线a| 亚洲视频免费在线 | 久热久草| 黄色特级毛片 | 成人高清av在线 | 久久精品国产99 | 狠狠五月婷婷 | 国产视频一区在线播放 | 亚洲国产欧美在线人成大黄瓜 | 欧美日韩一级久久久久久免费看 | 欧美一区视频 | 韩日精品在线观看 | 天天综合日 | 国产精品久久久免费看 | 蜜臀av性久久久久蜜臀aⅴ流畅 | 日韩中文字幕国产 | 开心色停停 | 免费观看性生交大片3 | 精品国模一区二区 | 精品国产精品久久 | 干干操操 | 国产乱对白刺激视频不卡 | 亚洲视频久久久久 | 国产h片在线观看 | 91漂亮少妇露脸在线播放 | 国产精品毛片一区二区 | 免费观看mv大片高清 | 天堂av在线网 | 国产在线视频一区二区三区 | 色播五月激情综合网 | 亚洲精品日韩在线观看 | 97视频在线观看视频免费视频 | 成人全视频免费观看在线看 | av在线免费观看网站 | 久久热亚洲| 日韩欧美一区二区三区视频 | 国产精品久久久久久久久久久免费看 | 中文字幕精品一区二区三区电影 | 成人手机在线视频 | 正在播放国产精品 | 国产精品专区在线观看 | 国产高清视频网 | 麻豆国产网站入口 | 日韩国产精品久久久久久亚洲 | 亚洲 欧美 91 | 免费日韩一区二区三区 | 四虎影视成人 | 伊人五月 | 又湿又紧又大又爽a视频国产 | 久久激情婷婷 | 国产色婷婷在线 | 国产一区欧美在线 | 97在线超碰 | 天天拍天天爽 | 国产精品夜夜夜一区二区三区尤 | 久久国产福利 | 97在线公开视频 | 久久精品99久久久久久 | 一级欧美一级日韩 | 69久久99精品久久久久婷婷 | 日韩免费观看高清 | 97超碰色偷偷 | 亚洲精品网站在线 | 免费av视屏 | 色噜噜日韩精品一区二区三区视频 | 色综合天天综合网国产成人网 | 狠狠色伊人亚洲综合网站色 | 波多野结衣在线中文字幕 | 亚洲久久视频 | 日韩有码网站 | 欧美日韩69 | 色香蕉在线 | 亚洲码国产日韩欧美高潮在线播放 | 500部大龄熟乱视频使用方法 | 中文字幕一区二区三区在线观看 | 午夜精品一区二区三区在线视频 | 免费看国产视频 | 九九免费在线观看视频 | 999久久a精品合区久久久 | 久久五月精品 | 久久1区 | 91av99| 六月婷操 | 久久激情网站 | 久久国产精品99精国产 | 久久久久女人精品毛片 | 国产视频导航 | 五月激情久久 | 亚洲少妇天堂 | 天天爱天天舔 | 欧美高清视频不卡网 | 中文字幕av最新更新 | 国产经典三级 | av丝袜在线 | 911国产 | 337p欧美| 欧美一级特黄aaaaaa大片在线观看 | 亚洲色图 校园春色 | 美女久久久久 | 在线日韩亚洲 | 九色精品在线 | 五月婷视频 | 成人免费av电影 | 日韩av在线网站 | 9999亚洲 | 天天爱天天操天天爽 | 精品av在线播放 | 五月婷婷免费 | 欧洲精品码一区二区三区免费看 | 五月天婷婷免费视频 | 青草视频在线免费 | 91桃色在线播放 | 久精品视频免费观看2 | 91亚洲综合| 日韩欧美电影在线 | 欧美一区二区三区在线看 | 99热99热 | 最新国产在线 | 日本精品中文字幕 | 久久精品中文字幕一区二区三区 | av电影免费在线看 | 日本少妇久久久 | 日韩精品一区二区电影 | 正在播放国产一区 | 97成人超碰 | 日韩乱码中文字幕 | 久久免费视频在线 | 日韩在线网| 九九九视频精品 | 国产一线在线 | 99re国产 | 免费看的国产视频网站 | 最近中文字幕大全 | 国产精品av在线 | 亚洲日b视频 | 天天干天天草 | 久久99亚洲热视 | 综合久久2023 | 天天草天天干天天 | 66av99精品福利视频在线 | 亚洲黄色网络 | 成人免费xxxxxx视频 | 91视频在线免费观看 | 一区二区三区播放 | 黄网站污 | 欧美日韩国产一二三区 | 欧美日韩国产综合网 | 99r在线视频 | 久久久久免费网 | 日本一区二区三区免费看 | 日本最新高清不卡中文字幕 | 超碰国产在线播放 | 91视频在线网址 | 国产精品一区二区三区久久久 | 一区二区三区高清在线观看 | 一本色道久久综合亚洲二区三区 | 久久免费片| 精品久久免费看 | 精品一区在线 | 久久国产手机看片 | 波多野结衣电影一区二区三区 | 久久中文视频 | 一区二区伦理电影 | 99人久久精品视频最新地址 | 中字幕视频在线永久在线观看免费 | 中文字幕高清在线 | 亚洲国产中文字幕 | 久久视频在线 | 蜜桃av综合网 | 亚洲精品乱码久久久久久蜜桃动漫 | 在线观看精品一区 | 91视频3p| 毛片区| 日韩在线不卡视频 | 2021国产在线视频 | 欧美一级片免费在线观看 | 成人免费看片98欧美 | 色在线网站| 三级a视频| 99热在线网站 | 精品人人人人 | 九九九热精品免费视频观看 | 一区二区视频在线观看免费 | 久久激情小说 | 欧美成人区 | 97在线观视频免费观看 | 国产 日韩 在线 亚洲 字幕 中文 | 精品国产一区二区三区久久 | 国产免费观看久久黄 | 欧美一区二区三区免费观看 | 在线成人欧美 | 国产成人一区二区三区 | 日韩免费观看视频 | 久久成年人视频 | 久久免费精彩视频 | 欧美成人a在线 | 玖草在线观看 | 日韩欧美在线综合网 | 国语久久 | 午夜体验区 | 国产高清成人在线 | 亚洲免费公开视频 | av中文字幕在线电影 | 色综合久久久久久中文网 | 日韩精品高清视频 | 人人爽久久久噜噜噜电影 | 亚洲精品国产精品国自 | 日韩高清一二区 | 黄色精品一区二区 | 色综合国产 | 久久99久久99精品免视看婷婷 | 探花国产在线 | 粉嫩av一区二区三区免费 | 免费在线观看视频a | 在线观看一区 | 99色在线视频 | 久久久国产成人 | 成年人视频在线观看免费 | av日韩av| 一二区精品 | 激情在线免费视频 | 青春草视频在线播放 | 久久99久久99 | 久色伊人| 91视频麻豆| 97在线免费视频观看 | 在线观看亚洲 | 欧美性一级观看 | 成年人在线免费视频观看 | 97在线观看视频 | 天天色天天射天天干 | 精品乱码一区二区三四区 | 一级片免费视频 | 在线黄色av| 日本xxxx裸体xxxx17 | 99久久婷婷国产精品综合 | 久久一级电影 | 亚洲乱码精品久久久久 | 日韩啪啪小视频 | 一区二区三区在线影院 | 欧美日韩后 | 99精品福利 | 91综合久久一区二区 | 国产精品日韩在线观看 | 国产麻豆精品95视频 | 日韩在线播放av | 狠狠狠狠狠操 | 国产一区二区三区高清播放 | h网站免费在线观看 | 欧美日韩中文另类 | 国产黄色av影视 | 国产精品久久久久久久久久直播 | 欧美一级片免费在线观看 | 欧美日韩网址 | www欧美xxxx | 99精品国产99久久久久久福利 | 黄色一级在线免费观看 | 欧美国产在线看 | 国产精品久久久久久久久久久久午夜 | 国产高清第一页 | 日韩精品中文字幕在线播放 | 超碰人人舔 | 狠狠操91| 亚洲精品综合在线观看 | 精品久久久久国产 | 久久经典视频 | 国产第一福利网 | 久久精品人人做人人综合老师 | 最新久久久 | 国产做爰视频 | 特黄特色特刺激视频免费播放 | 97超碰精品| 日韩精品视频在线观看网址 | 狠狠撸电影 | 久久免费视频这里只有精品 | 国产一级a毛片视频爆浆 | 精品亚洲免费 | 国产精品成人一区二区 | 欧美成年人在线观看 | 国产成人精品综合久久久久99 | 久久久久久久久久久高潮一区二区 | 在线观看第一页 | 午夜精品一区二区三区免费视频 | 黄色影院在线播放 | 日韩欧美视频在线观看免费 | 亚洲一二三久久 | 久久久久久蜜桃一区二区 | 九九免费精品视频在线观看 | 九九综合在线 | 久久97久久97精品免视看 | 久久er99热精品一区二区 | 日韩欧美大片免费观看 | 麻豆 videos| 久久久www | 国产一区二区精品久久 | 久久影视精品 | 日韩中文字幕免费在线观看 | 在线观看国产v片 | 国产一区二区观看 | 涩涩网站免费 | 亚洲精品mv在线观看 | 免费观看国产精品视频 |