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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > HTML >内容正文

HTML

前端测试框架 jasmine 的使用

發布時間:2023/12/10 HTML 59 豆豆
生活随笔 收集整理的這篇文章主要介紹了 前端测试框架 jasmine 的使用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?????? 最近的項目在使用AngulaJs,對JS代碼的測試問題就擺在了面前。通過對比我們選擇了 Karma? + jasmine ,使用 Jasmine做單元測試 ,Karma 自動化完成,當然了如果使用 Karma? + jasmine 前提是必須安裝?Nodejs。

安裝好 Nodejs ,使用 npm 安裝好必要的包,寫了一個測試用例,測試通過,很好很強大。 沒有 Nodejs 環境可以使用 Jasmine 做單元測試嗎?當然可以,我們可以到 官網下一個示例看一看,比較簡單。今天先講一下如果直接使用

jasmine 做單元測試

   簡單示例

   jasmine 示例下載地址 ?https://github.com/jasmine/jasmine/releases 選擇最新版本下載下來示例代碼結構如圖

???????

  lib 文件夾下面:  boot.js 啟動文件? ,

            console.js 輸出輔助文件,

          ??? jasmine-html.js 測試頁面 Dom 操作文件,

           ? ?jasmine.js jasmine核心文件

??? spec 文件夾 :??? PlayerSpec.js? 單元測試文件

          SpecHelper.js ?? jasmine 斷言擴展文件(自定義 Matcher)

??? src 文件夾 ,下面是被測試的 js 文件。? SpecRunner.html 為測試結果頁面。

  SpecRunner.html 代碼,注意js文件加載順序

???

<!DOCTYPE html> <html> <head><meta charset="utf-8"><title>Jasmine Spec Runner v2.5.2</title><link rel="shortcut icon" type="image/png" href="lib/jasmine-2.5.2/jasmine_favicon.png"><link rel="stylesheet" href="lib/jasmine-2.5.2/jasmine.css"><script src="lib/jasmine-2.5.2/jasmine.js"></script><script src="lib/jasmine-2.5.2/jasmine-html.js"></script><script src="lib/jasmine-2.5.2/boot.js"></script><!-- include source files here... --><script src="src/Player.js"></script><script src="src/Song.js"></script><!-- include spec files here... --><script src="spec/SpecHelper.js"></script><script src="spec/PlayerSpec.js"></script></head><body> </body> </html>

?

??? 我們直接運行 SpecRunner.html? 測試結果如下:

5個 specs,0個失敗,全部通過。在 PlayerSpec.js 里添加一個Suite,看看報錯是什么樣的。

describe("error test",function() {it("Here the test does not pass",function() {expect(1).toBe(2);}); })

?

哈哈,測試未通過,看到沒,這里顯示了詳細的錯誤信息。

   jasmine 語法詳解

??????? 首先了解幾個概念: Suite 指一個測試集, describe方法標志著一個測試集。

            Spec 表示測試用例,jasmine中用方法it來開始 specs。

            一個 Suite可以包含多個?Spec,一個 spec 可以包含多個 expections 斷言

  示例1

??

//測試集 開始于調用全局Jasmine函數describe,有兩個參數:一個字符串和一個函數。 //該字符串是specs(測試用例)單元測試的名稱或標題 - 通常是被測試的。 該函數是一個實現單元測試的代碼塊。describe("A suite", function() {it("contains spec with an expectation", function() {expect(true).toBe(true);}); });

?

  示例2?? ???? 包含多個斷言

?

describe("A suite is just a function", function() {var a;it("and so is a spec", function() {a = true;expect(a).toBe(true);}); });describe("The 'toBe' matcher compares with ===", function() {it("and has a positive case", function() {expect(true).toBe(true);});it("and can have a negative case", function() {expect(false).not.toBe(true);}); });

?

?示例3?? 常用語法,describe嵌套

describe("Included matchers:", function() {it("The 'toBe' matcher compares with ===", function() {var a = 12;var b = a;expect(a).toBe(b);expect(a).not.toBe(null);});describe("The 'toEqual' matcher", function() {it("works for simple literals and variables", function() {var a = 12;expect(a).toEqual(12);});it("should work for objects", function() {var foo = {a: 12,b: 34};var bar = {a: 12,b: 34};expect(foo).toEqual(bar);});});it("The 'toMatch' matcher is for regular expressions", function() {var message = "foo bar baz";expect(message).toMatch(/bar/);expect(message).toMatch("bar");expect(message).not.toMatch(/quux/);});it("The 'toBeDefined' matcher compares against `undefined`", function() {var a = {foo: "foo"};//已定義expect(a.foo).toBeDefined();expect(a.bar).not.toBeDefined();});it("The `toBeUndefined` matcher compares against `undefined`", function() {var a = {foo: "foo"};//未定義expect(a.foo).not.toBeUndefined();expect(a.bar).toBeUndefined();});it("The 'toBeNull' matcher compares against null", function() {var a = null;var foo = "foo";expect(null).toBeNull();expect(a).toBeNull();expect(foo).not.toBeNull();});it("The 'toBeTruthy' matcher is for boolean casting testing", function() {var a, foo = "foo";expect(foo).toBeTruthy();expect(a).not.toBeTruthy();});it("The 'toBeFalsy' matcher is for boolean casting testing", function() {var a, foo = "foo";expect(a).toBeFalsy();expect(foo).not.toBeFalsy();});describe("The 'toContain' matcher", function() {it("works for finding an item in an Array", function() {var a = ["foo", "bar", "baz"];//包含expect(a).toContain("bar");expect(a).not.toContain("quux");});it("also works for finding a substring", function() {var a = "foo bar baz";expect(a).toContain("bar");expect(a).not.toContain("quux");});});it("The 'toBeLessThan' matcher is for mathematical comparisons", function() {var pi = 3.1415926,e = 2.78;//小于expect(e).toBeLessThan(pi);expect(pi).not.toBeLessThan(e);});it("The 'toBeGreaterThan' matcher is for mathematical comparisons", function() {var pi = 3.1415926,e = 2.78;//大于expect(pi).toBeGreaterThan(e);expect(e).not.toBeGreaterThan(pi);});it("The 'toBeCloseTo' matcher is for precision math comparison", function() {var pi = 3.1415926,e = 2.78;//臨近 是比較兩個值是否足夠接近(不一定要相等)//源碼:pass: Math.abs(expected - actual) < (Math.pow(10, -precision) / 2)//即 pi - e 的絕對值 是否 小于 10 的 X(2) 次方 / 2//以 expect(pi).not.toBeCloseTo(e, 3); 為例,就是 pi 跟 e 的差 絕對值 ,是否小于 1/1000 除以 2 ,即 0.0005 expect(pi).not.toBeCloseTo(e, 2);expect(pi).toBeCloseTo(e, 0);});it("The 'toThrow' matcher is for testing if a function throws an exception", function() {var foo = function() {return 1 + 2;};var bar = function() {return a + 1;};//是否引發異常expect(foo).not.toThrow();expect(bar).toThrow();});it("The 'toThrowError' matcher is for testing a specific thrown exception", function() {var foo = function() {throw new TypeError("foo bar baz");};//是否拋出指定錯誤expect(foo).toThrowError("foo bar baz");expect(foo).toThrowError(/bar/);expect(foo).toThrowError(TypeError);expect(foo).toThrowError(TypeError, "foo bar baz");}); });//手動制造一個斷言失敗//fail函數使specs(測試用例)失敗。 它可以將失敗消息或Error對象作為參數。 describe("A spec using the fail function", function() {var foo = function(x, callBack) {if (x) {callBack();}};it("should not call the callBack", function() {foo(false, function() { fail("Callback has been called");});}); });//分組相關規則帶 //describe 函數用于對相關specs(測試用例)進行分組。 string參數用于命名specs的集合,并且將與specs連接以構成spec的全名。 //這有助于在 測試集 找到規則。 如果你很好地命名他們,你的規則讀為傳統的BDD風格的完整句子。describe("A spec", function() {it("is just a function, so it can contain any code", function() {var foo = 0;foo += 1;expect(foo).toEqual(1);});it("can have more than one expectation", function() {var foo = 0;foo += 1;expect(foo).toEqual(1);expect(true).toEqual(true);}); });

?示例4?? beforeEach,afterEach,beforeAll和afterAll函數

//顧名思義,beforeEach函數在調用它的describe中的每個 spec 之前調用一次,afterEach函數在每個spec之后調用一次。 //這里是同一組specs(測試用例)寫得有點不同。 被測變量定義在頂層作用域 - 描述塊和初始化代碼被移入一個beforeEach函數。 //afterEach函數在繼續之前重置變量。 describe("A spec using beforeEach and afterEach", function() {var foo = 0;beforeEach(function() {foo += 1;});afterEach(function() {foo = 0;});it("is just a function, so it can contain any code", function() {expect(foo).toEqual(1);});it("can have more than one expectation", function() {expect(foo).toEqual(1);expect(true).toEqual(true);}); });//beforeAll函數僅在describe中的所有specs(測試用例)運行之前調用一次,并且afterAll函數在所有specs(測試用例)完成后調用。 //這些功能可用于加快測試集 的昂貴設置和拆卸。 //但是,要小心使用beforeAll和afterAll! 由于它們不在specs(測試用例)之間重置,很容易在specs(測試用例)之間意外泄漏狀態, //使它們錯誤地通過或失敗。 注意跟 beforeEach 的區別, //如果 在第1個 it 里改變了 foo 的值,第2個 it 的值就不是 初始化時的值了 describe("A spec using beforeAll and afterAll", function() {var foo;beforeAll(function() {foo = 1;});afterAll(function() {foo = 0;});it("sets the initial value of foo before specs run", function() {expect(foo).toEqual(1);foo += 1;});it("does not reset foo between specs", function() {expect(foo).toEqual(2);}); });

?示例5? this關鍵字共享變量,嵌套describe

//this關鍵字//另一種在beforeEach,it和afterEach之間共享變量的方法是通過this關鍵字。 //每個spec的beforeEach / it / afterEach都將這個作為同一個空對象,對于下一個spec的beforeEach / it / afterEach設置為空。 describe("A spec", function() {beforeEach(function() {this.foo = 0;});it("can use the `this` to share state", function() {expect(this.foo).toEqual(0);this.bar = "test pollution?";});it("prevents test pollution by having an empty `this` created for the next spec", function() {expect(this.foo).toEqual(0);//注意這里的區別 undefinedexpect(this.bar).toBe(undefined);}); });//嵌套describe , describe 里嵌套 describe//調用describe可以嵌套,在任何級別定義specs(測試用例)。 這允許一個單元測試被組成一個函數樹。 //在執行specs(測試用例)之前,Jasmine沿著樹順序執行每個beforeEach函數。 //在specs(測試用例)執行后,Jasmine類似地遍歷 afterEach 函數。 describe("A spec", function() {var foo;beforeEach(function() {foo = 0;foo += 1;});afterEach(function() {foo = 0;});it("is just a function, so it can contain any code", function() {expect(foo).toEqual(1);});it("can have more than one expectation", function() {expect(foo).toEqual(1);expect(true).toEqual(true);});describe("nested inside a second describe", function() {var bar;beforeEach(function() {bar = 1;});it("can reference both scopes as needed", function() {expect(foo).toEqual(bar);});}); });

?示例6?? Pending 待定規則

//待定規則 //待處理的規則不會運行,但它們的名稱將在結果中顯示為待處理。 describe("Pending specs", function() {//任何用xit聲明的spec都被標記為pending。xit("can be declared 'xit'", function() {expect(true).toBe(false);});//在沒有函數體的情況下聲明的任何specs(測試用例)也將在結果中被標記為待處理it("can be declared with 'it' but without a function");//pending() 如果你在specs(測試用例)體中任何地方調用該函數,無論預期如何,specs(測試用例)將被標記為待定。 //pending()函數接受一個字符串參數,該參數會在結果集中顯示在 PENDING WITH MESSAGE:之后,作為為何被Pending的原因。it("can be declared by calling 'pending' in the spec body", function() {expect(true).toBe(false);pending('this is why it is pending');}); });

?示例7? Spies 對象監控

// Spies//Jasmine有 spies(監控) 雙重測試功能。 spy 可以存根任何函數并跟蹤對它和所有參數的調用。 //spy 只存在于描述或其定義的塊中,并且將在每個specs(測試用例)之后刪除。 有特殊的匹配器與 spies 交互。 //Jasmine 2.0的語法已更改。describe("A spy", function() {var foo, bar = null;beforeEach(function() {foo = {setBar: function(value) {bar = value;}};spyOn(foo, 'setBar');//spyOn(foo, 'setBar').and.callThrough();foo.setBar(123);foo.setBar(456, 'another param');});//如果調用 Spies ,toHaveBeenCalled匹配器將返回true。//是否被調用it("tracks that the spy was called", function() {expect(foo.setBar).toHaveBeenCalled();});//如果 Spies 被調用了指定的次數,toHaveBeenCalledTimes匹配器將通過。it("tracks that the spy was called x times", function() {expect(foo.setBar).toHaveBeenCalledTimes(2);});//如果參數列表匹配任何記錄的調用到 Spies ,toHaveBeenCalledWith匹配器將返回true。it("tracks all the arguments of its calls", function() {expect(foo.setBar).toHaveBeenCalledWith(123);expect(foo.setBar).toHaveBeenCalledWith(456, 'another param');});it("stops all execution on a function", function() {//有沒有感到奇怪,beforeEach 里調用了 foo.setBar(),這里為什么 bar 的值為 null ?? //原因是 spyOn(foo, 'setBar'); 并不會去調用 真實的 foo.setBar()函數,只是調用了 Jasmine 保存的這個函數的 存根,不會影響到實際的值//如果這樣寫 spyOn(foo, 'setBar').and.callThrough(); 就會調用真實的 foo.setBar()函數了,bar的值也會跟隨改變expect(bar).toBeNull();}); });// Spies :and.callThrough //通過使用and.callThrough鏈接 Spies , Spies 仍然會跟蹤對它的所有調用,但此外它將委派給實際的實現。 describe("A spy, when configured to call through", function() {var foo, bar, fetchedBar;beforeEach(function() {foo = {setBar: function(value) {bar = value;},getBar: function() {return bar;}};spyOn(foo, 'getBar').and.callThrough();foo.setBar(123);fetchedBar = foo.getBar();});it("tracks that the spy was called", function() {expect(foo.getBar).toHaveBeenCalled();});it("should not affect other functions", function() {expect(bar).toEqual(123);});it("when called returns the requested value", function() {//這里 fetchedBar 有值//這就是 spyOn(foo, 'getBar').and.callThrough() 跟 spyOn(foo, 'getBar') 的區別expect(fetchedBar).toEqual(123);}); });// Spies :and.returnValue//通過使用and.returnValue鏈接 Spies ,所有對函數的調用都將返回特定的值。 describe("A spy, when configured to fake a return value", function() {var foo, bar, fetchedBar;beforeEach(function() {foo = {setBar: function(value) {bar = value;},getBar: function() {return bar;}};spyOn(foo, "getBar").and.returnValue(745);foo.setBar(123);//所有調用 foo.getBar() 函數都返回 745fetchedBar = foo.getBar();});it("tracks that the spy was called", function() {expect(foo.getBar).toHaveBeenCalled();});it("should not affect other functions", function() {expect(bar).toEqual(123);});it("when called returns the requested value", function() {expect(fetchedBar).toEqual(745);}); });// specs :and.returnValues//通過使用and.returnValues鏈接 specs ,所有對函數的調用將按順序返回特定的值, //直到它到達返回值列表的結尾,此時它將返回未定義的所有后續調用。 describe("A spy, when configured to fake a series of return values", function() {var foo, bar;beforeEach(function() {foo = {setBar: function(value) {bar = value;},getBar: function() {return bar;}};spyOn(foo, "getBar").and.returnValues("fetched first", "fetched second");foo.setBar(123);});it("tracks that the spy was called", function() {//返回調用次數 對應的 參數數組 下標的值foo.getBar(123); expect(foo.getBar).toHaveBeenCalled();});it("should not affect other functions", function() {//不要迷惑了,賦值是在 beforeEach 里做的,不是 foo.getBar(123); expect(bar).toEqual(123);});it("when called multiple times returns the requested values in order", function() {//返回調用次數 對應的 參數數組 下標的值expect(foo.getBar()).toEqual("fetched first");expect(foo.getBar()).toEqual("fetched second");expect(foo.getBar()).toBeUndefined();}); });// specs :and.callFake //通過使用and.callFake鏈接 specs ,所有對 specs 的調用都將委派給提供的函數。 describe("A spy, when configured with an alternate implementation", function() {var foo, bar, fetchedBar;beforeEach(function() {foo = {setBar: function(value) {bar = value;},getBar: function() {return bar;}};//如果被窺探的函數接收到假的需要的參數,你可以得到那些spyOn(foo, "getBar").and.callFake(function(arguments, can, be, received) {return 1001;});foo.setBar(123);fetchedBar = foo.getBar();});it("tracks that the spy was called", function() {expect(foo.getBar).toHaveBeenCalled();});it("should not affect other functions", function() {expect(bar).toEqual(123);});it("when called returns the requested value", function() {expect(fetchedBar).toEqual(1001);}); });// specs :and.throwError//通過使用and.throwError鏈接 specs ,所有對 specs 的調用都將拋出指定的值作為錯誤。 describe("A spy, when configured to throw an error", function() {var foo, bar;beforeEach(function() {foo = {setBar: function(value) {bar = value;}};spyOn(foo, "setBar").and.throwError("quux");});it("throws the value", function() {expect(function() {foo.setBar(123)}).toThrowError("quux");}); });// specs :and.stub//當調用策略用于 specs 時,可以隨時使用and.stub返回原始的存根行為。 describe("A spy", function() {var foo, bar = null;beforeEach(function() {foo = {setBar: function(value) {bar = value;}};spyOn(foo, 'setBar').and.callThrough();});it("can call through and then stub in the same spec", function() {foo.setBar(123);expect(bar).toEqual(123);foo.setBar.and.stub();bar = null;foo.setBar(123);//返回原始的存根expect(bar).toBe(null);}); });

?在上面這段代碼里 ,要注意 Spies :and.callThrough? 的用法? 注意代碼? spyOn(foo, 'getBar').and.callThrough();spyOn(foo, 'getBar');? 的區別 ?spyOn(foo, 'getBar').and.callThrough() 會調用實例方法

產生實際的影響,而 spyOn(foo, 'getBar');? 只是調用了 Jasmine 保存的這個函數的 存根,不會影響到實際的值 ,如果沒看明白請仔細看代碼上我添加的注釋。

?

示例8?? 其他屬性

describe("A spy", function() {var foo, bar = null;//每個對 specs 的調用都會被跟蹤并在calls屬性上公開beforeEach(function() {foo = {setBar: function(value) {bar = value;}};spyOn(foo, 'setBar');});//.calls.any():如果spy沒有被調用,則返回false,如果至少有一個調用發生,則返回true it("tracks if it was called at all", function() {expect(foo.setBar.calls.any()).toEqual(false);foo.setBar();expect(foo.setBar.calls.any()).toEqual(true);});//.calls.count():返回調用 specs 的次數it("tracks the number of times it was called", function() {expect(foo.setBar.calls.count()).toEqual(0);foo.setBar();foo.setBar();expect(foo.setBar.calls.count()).toEqual(2);});//.calls.argsFor(index):返回傳遞給調用號索引的參數 it("tracks the arguments of each call", function() {foo.setBar(123);foo.setBar(456, "baz");expect(foo.setBar.calls.argsFor(0)).toEqual([123]);expect(foo.setBar.calls.argsFor(1)).toEqual([456, "baz"]);});//.calls.allArgs():返回所有調用的參數it("tracks the arguments of all calls", function() {foo.setBar(123);foo.setBar(456, "baz");expect(foo.setBar.calls.allArgs()).toEqual([[123],[456, "baz"]]);});//.calls.all():返回上下文(this)和傳遞所有調用的參數 it("can provide the context and arguments to all calls", function() {foo.setBar(123);expect(foo.setBar.calls.all()).toEqual([{object: foo, args: [123], returnValue: undefined}]);});//.calls.mostRecent():返回上一次調用的上下文(this)和參數it("has a shortcut to the most recent call", function() {foo.setBar(123);foo.setBar(456, "baz");expect(foo.setBar.calls.mostRecent()).toEqual({object: foo, args: [456, "baz"], returnValue: undefined});});//.calls.first():返回上下文(this)和第一次調用的參數it("has a shortcut to the first call", function() {foo.setBar(123);foo.setBar(456, "baz");expect(foo.setBar.calls.first()).toEqual({object: foo, args: [123], returnValue: undefined});});//當檢查來自all(),mostRecent()和first()的返回時,當調用 specs 時,object屬性被設置為this的值。it("tracks the context", function() {var spy = jasmine.createSpy('spy');var baz = {fn: spy};var quux = {fn: spy};baz.fn(123);quux.fn(456);//.object 返回的this ,即調用對象expect(spy.calls.first().object).toBe(baz);expect(spy.calls.mostRecent().object).toBe(quux);});//.calls.reset():清除 specs 的所有跟蹤it("can be reset", function() {foo.setBar(123);foo.setBar(456, "baz");expect(foo.setBar.calls.any()).toBe(true);foo.setBar.calls.reset();expect(foo.setBar.calls.any()).toBe(false);}); });// specs :createSpy //當沒有一個函數來監視,jasmine.createSpy可以創建一個“裸” specs 。 //這個 specs 作為任何其他 specs - 跟蹤調用,參數等,但其沒有實現。 specs 是JavaScript對象,可以這樣使用。 describe("A spy, when created manually", function() {var whatAmI;beforeEach(function() {whatAmI = jasmine.createSpy('whatAmI');whatAmI("I", "am", "a", "spy");});it("is named, which helps in error reporting", function() {expect(whatAmI.and.identity()).toEqual('whatAmI');});it("tracks that the spy was called", function() {expect(whatAmI).toHaveBeenCalled();});it("tracks its number of calls", function() {expect(whatAmI.calls.count()).toEqual(1);});it("tracks all the arguments of its calls", function() {expect(whatAmI).toHaveBeenCalledWith("I", "am", "a", "spy");});it("allows access to the most recent call", function() {expect(whatAmI.calls.mostRecent().args[0]).toEqual("I");}); });// specs :createSpyObj //為了創建一個有多個 specs 的模擬,使用jasmine.createSpyObj并傳遞一個字符串數組。 它返回一個對象,它具有屬于 specs 的每個字符串的屬性。 describe("Multiple spies, when created manually", function() {var tape;beforeEach(function() {tape = jasmine.createSpyObj('tape', ['play', 'pause', 'stop', 'rewind']);tape.play();tape.pause();tape.rewind(0);});it("creates spies for each requested function", function() {expect(tape.play).toBeDefined();expect(tape.pause).toBeDefined();expect(tape.stop).toBeDefined();expect(tape.rewind).toBeDefined();});it("tracks that the spies were called", function() {expect(tape.play).toHaveBeenCalled();expect(tape.pause).toHaveBeenCalled();expect(tape.rewind).toHaveBeenCalled();expect(tape.stop).not.toHaveBeenCalled();});it("tracks all the arguments of its calls", function() {expect(tape.rewind).toHaveBeenCalledWith(0);}); });//匹配所有與jasmine.any describe("jasmine.anything", function() {//如果實際值不為null或未定義,jasmine.anything返回true。it("matches anything", function() {expect(1).toEqual(jasmine.anything());});describe("when used with a spy", function() {it("is useful when the argument can be ignored", function() {var foo = jasmine.createSpy('foo');foo(12, function() {return false;});expect(foo).toHaveBeenCalledWith(12, jasmine.anything());});}); });//與jasmine.objectContaining的部分匹配 //jasmine.objectContaining是用于期望在實際中只關心某些鍵/值對的時候。 describe("jasmine.objectContaining", function() {var foo;beforeEach(function() {foo = {a: 1,b: 2,bar: "baz"};});it("matches objects with the expect key/value pairs", function() {//只比對barexpect(foo).toEqual(jasmine.objectContaining({bar: "baz"}));expect(foo).not.toEqual(jasmine.objectContaining({c: 37}));});describe("when used with a spy", function() {it("is useful for comparing arguments", function() {var callback = jasmine.createSpy('callback');callback({bar: "baz"});expect(callback).toHaveBeenCalledWith(jasmine.objectContaining({bar: "baz"}));expect(callback).not.toHaveBeenCalledWith(jasmine.objectContaining({c: 37}));});}); });//部分數組與jasmine.arrayContaining相匹配 //jasmine.arrayContaining用于那些期望只關心數組中的某些值的時候。 describe("jasmine.arrayContaining", function() {var foo;beforeEach(function() {foo = [1, 2, 3, 4];});it("matches arrays with some of the values", function() {expect(foo).toEqual(jasmine.arrayContaining([3, 1]));expect(foo).not.toEqual(jasmine.arrayContaining([6]));});describe("when used with a spy", function() {it("is useful when comparing arguments", function() {var callback = jasmine.createSpy('callback');callback([1, 2, 3, 4]);expect(callback).toHaveBeenCalledWith(jasmine.arrayContaining([4, 2, 3]));expect(callback).not.toHaveBeenCalledWith(jasmine.arrayContaining([5, 2]));});}); });//字符串與jasmine.stringMatching匹配 //jasmine.stringMatching用于當你不想完全匹配較大對象中的字符串時,或者匹配 specs 預期中的字符串的一部分。 describe('jasmine.stringMatching', function() {it("matches as a regexp", function() {expect({foo: 'bar'}).toEqual({foo: jasmine.stringMatching(/^bar$/)});expect({foo: 'foobarbaz'}).toEqual({foo: jasmine.stringMatching('bar')});});describe("when used with a spy", function() {it("is useful for comparing arguments", function() {var callback = jasmine.createSpy('callback');callback('foobarbaz');expect(callback).toHaveBeenCalledWith(jasmine.stringMatching('bar'));expect(callback).not.toHaveBeenCalledWith(jasmine.stringMatching(/^bar$/));});}); });//定制不對稱等式測試器 //當您需要檢查某個滿足特定標準的條件,而不是嚴格相等時,您還可以通過提供具有asymmetricMatch函數的對象來指定自定義非對稱等式測試器。 describe("custom asymmetry", function() {var tester = {asymmetricMatch: function(actual) {var secondValue = actual.split(',')[1];return secondValue === 'bar';}};it("dives in deep", function() {expect("foo,bar,baz,quux").toEqual(tester);});describe("when used with a spy", function() {it("is useful for comparing arguments", function() {var callback = jasmine.createSpy('callback');callback('foo,bar,baz');expect(callback).toHaveBeenCalledWith(tester);});}); });

?示例 9? Jasmine 時鐘

//Jasmine 時鐘 //Jasmine 2.0的此語法已更改。 Jasmine時鐘可用于測試時間相關代碼。 describe("Manually ticking the Jasmine Clock", function() {var timerCallback;//它安裝調用了 jasmine.clock()。安裝在需要操縱時間的spec或suite。beforeEach(function() {timerCallback = jasmine.createSpy("timerCallback");jasmine.clock().install();});//完成恢復原始功能后,請務必卸載時鐘。afterEach(function() {jasmine.clock().uninstall();});//模擬JavaScript超時函數//您可以使setTimeout或setInterval同步執行已注冊的函數,只有當時鐘在時間上向前跳過時。//要執行注冊的函數,通過jasmine.clock()。tick函數延時時間,該函數 參數為 毫秒。it("causes a timeout to be called synchronously", function() {setTimeout(function() {timerCallback();}, 100);expect(timerCallback).not.toHaveBeenCalled();jasmine.clock().tick(101);expect(timerCallback).toHaveBeenCalled();});it("causes an interval to be called synchronously", function() {setInterval(function() {timerCallback();}, 100);expect(timerCallback).not.toHaveBeenCalled();jasmine.clock().tick(101);expect(timerCallback.calls.count()).toEqual(1);jasmine.clock().tick(50);expect(timerCallback.calls.count()).toEqual(1);jasmine.clock().tick(50);expect(timerCallback.calls.count()).toEqual(2);});//模擬日期//Jasmine時鐘也可以用來模擬當前日期。describe("Mocking the Date object", function(){it("mocks the Date object and sets it to a given time", function() {var baseTime = new Date(2013, 9, 23);//如果你沒有為mockDate提供基準時間,它將使用當前日期。jasmine.clock().mockDate(baseTime);jasmine.clock().tick(50);expect(new Date().getTime()).toEqual(baseTime.getTime() + 50);});}); });

?

示例 10?? 異步支持

//異步支持 //Jasmine 2.0的此語法已更改。 Jasmine還支持運行需要測試異步操作的specs(測試用例)。 describe("Asynchronous specs", function() {var value;//調用beforeAll,afterAll,beforeEach,afterEach和它可以接受一個可選的單個參數,當異步工作完成時,應該調用。beforeEach(function(done) {setTimeout(function() {value = 0;done();}, 1);});//在done函數在調用之前,這個specs(測試用例)不會開始。//這個specs(測試用例)將會等待 beforeEach 調用 done() 后執行。it("should support async execution of test preparation and expectations", function(done) {value++;expect(value).toBeGreaterThan(0);expect(value).toBe(1);//所以這里value 的值為1done();});//默認情況下,jasmine將等待5秒鐘,異步specs(測試用例)在導致超時失敗之前完成。 //如果超時在調用done之前超時,則當前specs(測試用例)將被標記為失敗,并且單元測試執行將繼續,如同調用完成。//如果特定規則應該更快失敗或需要更多時間,可以通過向其傳遞超時值等來調整。//如果整個單元測試應該有不同的超時,則可以在任何給定描述之外全局設置jasmine.DEFAULT_TIMEOUT_INTERVAL。describe("long asynchronous specs", function() {beforeEach(function(done) {done();}, 1000);it("takes a long time", function(done) {setTimeout(function() {done();}, 9000);}, 10000);afterEach(function(done) {done();}, 1000);});//done.fail函數使specs(測試用例)失敗,并指示它已完成describe("A spec using done.fail", function() {var foo = function(x, callBack1, callBack2) {if (x) {setTimeout(callBack1, 0);} else {setTimeout(callBack2, 0);}};it("should not call the second callBack", function(done) {foo(true,done,function() {done.fail("Second callback has been called");});});}); });

?示例11? 自定義matcher?

//通常,項目將要封裝用于跨多個規范的自定義匹配代碼。 下面是如何創建一個Jasmine兼容的自定義匹配器。 //在其根部的自定義匹配器是比較函數,其獲取實際值和期望值。 //這個工廠被傳遞給Jasmine,理想的情況是調用beforeEach,并且在一個給定的調用中描述的所有規范的范圍內。 //定制匹配器在規格之間拆分。 工廠的名稱將是在期望的調用的返回值上暴露的匹配器的名稱。 var customMatchers = {//自定義匹配器工廠傳遞兩個參數:util,它有一組用于匹配器使用的效用函數(見:matchersUtil.js用于當前列表)和customEqualityTesters,//如果util.equals被調用,則需要傳遞。 當調用匹配器時,可以使用這些參數。toBeGoofy: function (util, customEqualityTesters) {//工廠方法應該返回一個含有比較函數的對象,該函數將被調用以檢查期望值。return {//比較函數第一個參數為實際值 ,第二個參數傳遞給匹配器本身的值(如果有的話)。compare: function (actual, expected) {//toBeGoofy接受一個可選的期望參數,所以如果不傳遞,在這里定義。if (expected === undefined) {expected = '';}var result = {};if (result.pass) {//如果未定義,期望將嘗試為匹配器創建失敗消息。 但是,如果返回值具有message屬性,它將用于失敗的期望。result.message = "Expected " + actual + " not to be quite so goofy";} else {//匹配成功,所以自定義失敗消息應該出現在負期望的情況下 - 當期望與.not一起使用時。result.message = "Expected " + actual + " to be goofy, but it was not very goofy";}return result;}};} };//調用代碼 describe("Custom matcher: 'toBeGoofy'", function() { beforeEach(function() {jasmine.addMatchers(customMatchers);});it("is available on an expectation", function () {expect({hyuk: 'gawrsh'}).toBeGoofy();});it("can take an 'expected' parameter", function () {expect({hyuk: 'gawrsh is fun'}).toBeGoofy('is fun');});it("can be negated", function () {expect({hyuk: 'this is fun'}).not.toBeGoofy();}); });

?看完上面的示例應該在項目中應用沒有什么問題了。

轉載于:https://www.cnblogs.com/fengh/p/6121846.html

總結

以上是生活随笔為你收集整理的前端测试框架 jasmine 的使用的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

免费在线观看日韩视频 | 亚洲免费小视频 | 天天操狠狠干 | 人人干天天干 | 中文在线免费看视频 | 91在线亚洲 | 天天射天天操天天色 | 999成人| 国产喷水在线 | 香蕉成人在线视频 | 久久久精品视频网站 | 亚洲综合成人av | 夜色资源站国产www在线视频 | 99久久激情| 日韩三级视频在线观看 | 在线看国产视频 | 久久美女视频 | 成人免费在线观看电影 | 久久亚洲电影 | 亚洲成人欧美 | 久久这里只有精品1 | 久久最新网址 | 成人中文字幕+乱码+中文字幕 | 欧美激情精品久久久久久免费印度 | 国产精品第 | 在线观看精品一区 | 国产精品嫩草影院123 | 免费看黄20分钟 | 日韩精品一区二区三区中文字幕 | 国产99久久久久久免费看 | 一级c片| 日韩激情网 | 免费影视大全推荐 | 成 人 黄 色 免费播放 | 久久精品一区二区三 | 免费看色网站 | 99久久精品网 | 成人手机在线视频 | 久久黄色免费视频 | www国产亚洲 | 亚洲精品视频中文字幕 | 91亚瑟视频 | 成人丝袜 | 综合伊人av | 色婷婷国产精品 | av免费观看高清 | 久久久久福利视频 | 欧美日韩精品网站 | 色婷婷视频在线 | 欧美日韩aa | 国产专区一 | 91精品影视 | 久久久久久久久久久影视 | 四虎在线免费观看视频 | 永久免费毛片在线观看 | 91亚洲影院 | 92国产精品久久久久首页 | 久久99爱视频 | 久久视讯 | 午夜免费久久看 | 91久久丝袜国产露脸动漫 | 国产日韩视频在线播放 | 色综合久久久网 | 久精品在线观看 | 在线播放 日韩专区 | 成人av一区二区兰花在线播放 | 亚洲电影久久 | 一区二区三区高清在线 | 麻豆视传媒官网免费观看 | 五月天.com | 久久99精品国产麻豆宅宅 | 精品久久免费看 | 国产手机视频在线观看 | 久久免费视频3 | 五月天伊人 | 免费成人av在线看 | 午夜精品一区二区三区免费视频 | 97精品国产| 国产在线视频一区 | 国产一区二区三区四区大秀 | 五月婷婷丁香激情 | 国产一区二区成人 | 精品久久一区 | 91在线观看视频 | 91免费的视频在线播放 | 黄色片网站av| 高清av在线 | 一区二区三区韩国免费中文网站 | 99精彩视频在线观看免费 | 久久九九国产精品 | 国产视频 亚洲视频 | 亚洲japanese制服美女 | 日本黄色免费播放 | 国产成人精品一区一区一区 | 日韩精品一区二区三区免费观看视频 | 国产精品成人一区二区 | 亚洲一级国产 | 国产精品麻豆果冻传媒在线播放 | zzijzzij日本成熟少妇 | 国内视频 | 亚洲激情 | 日韩色爱 | 国产免费视频一区二区裸体 | 久久综合色婷婷 | 久草在线视频免费资源观看 | 天天综合网~永久入口 | 美女视频黄频大全免费 | 天天天天天操 | 黄色小说免费在线观看 | 成年人免费看av | 久久精品久久精品 | 中文字幕免费一区二区 | 久久男人影院 | 久久福利小视频 | 日韩视频www | 天天操天天摸天天射 | 91亚色视频| 在线导航av | 青青河边草免费观看完整版高清 | 久久久免费毛片 | 91亚洲国产 | 人人玩人人添人人 | 日韩午夜小视频 | 99热精品国产一区二区在线观看 | 色婷婷av一区二 | 欧美视频二区 | 久久久91精品国产 | 999久久国精品免费观看网站 | 国产精品k频道 | 2019天天干夜夜操 | 欧美一级性 | 精品国产伦一区二区三区观看方式 | 这里有精品在线视频 | 成人av在线播放网站 | 就色干综合 | 久久国语露脸国产精品电影 | 国产精品视频观看 | 国产偷国产偷亚洲清高 | 在线中文字幕网站 | 成人久久久电影 | 91香蕉视频在线 | 日韩欧美精品一区二区三区经典 | 99精品免费在线 | 国产中文字幕一区二区 | 欧美一二三区在线观看 | 成人福利在线观看 | 黄色的网站免费看 | 久草精品免费 | 天天干天天操天天拍 | 在线观看麻豆av | 激情五月综合 | 69av视频在线观看 | 亚洲男男gaygayxxxgv | 精品美女久久久久 | 黄污网站在线 | 日韩理论片在线观看 | 99色在线视频 | 伊人电影在线观看 | 91女子私密保健养生少妇 | 麻豆久久久| 国产精品国产三级国产aⅴ无密码 | 国产精品黄色在线观看 | 久久在线一区 | 亚洲乱码久久久 | 九九影视理伦片 | 精品免费久久久久久 | www.91国产 | 国产一区二区三精品久久久无广告 | 亚洲视频高清 | 国产精品99久久久久久久久 | jizz18欧美18 | 国产成人精品aaa | 亚洲做受高潮欧美裸体 | 欧美久久精品 | 欧美一二三专区 | 日韩在线中文字幕视频 | 三级黄免费看 | 国产伦理久久精品久久久久_ | 国产精品久久久久永久免费观看 | 亚洲第一av在线播放 | 青青河边草免费观看 | 久草在线视频新 | 天天综合亚洲 | 久久成年人视频 | 粉嫩av一区二区三区四区五区 | 色综合久久88 | 国产一区二区三区免费视频 | 色噜噜日韩精品一区二区三区视频 | 国产精品久久久久9999吃药 | www.五月天激情 | 香蕉视频国产在线 | 欧美色综合天天久久综合精品 | 精品国产一区二区三区在线观看 | 在线97| 丁香婷婷成人 | 正在播放一区二区 | 首页中文字幕 | 国产99视频在线观看 | 96国产精品视频 | 天天视频亚洲 | 最近中文国产在线视频 | 黄色网在线免费观看 | 99免费在线| 人人操日日干 | www.少妇| 麻豆果冻剧传媒在线播放 | 国内外激情视频 | 四虎在线视频 | 人人dvd| 天天干天天操天天入 | 91精品国产91 | 美女福利视频一区二区 | 成人在线免费看 | 视频一区在线免费观看 | 亚洲激情 在线 | 奇米影视在线99精品 | 黄色网大全| 国产精品久久久久久久久久久久午 | 久久成年人视频 | 人人精品久久 | 日韩免费在线观看视频 | 久久国产精品一国产精品 | 天天色天天上天天操 | 欧美午夜一区二区福利视频 | 中文字幕一区二区三区四区视频 | 中文字幕在线免费播放 | 国产精品欧美久久久久三级 | 青青久草在线视频 | 欧洲精品码一区二区三区免费看 | 在线观看av中文字幕 | 97视频人人免费看 | 久久久五月天 | 亚洲va韩国va欧美va精四季 | 久久国产精品影视 | 久久久久国产一区二区三区 | 国产精品一区二区免费在线观看 | 超碰97网站 | 伊人狠狠色丁香婷婷综合 | 中文字幕亚洲综合久久五月天色无吗'' | 91av短视频 | 久久久久久久久久久影院 | 国产一线二线三线性视频 | 成人黄色av免费在线观看 | 99电影| 亚洲日本韩国一区二区 | 亚洲情影院 | 国产视频 亚洲视频 | 欧美一级网站 | 97视频一区 | 亚洲欧美国产日韩在线观看 | 日日摸日日爽 | 欧美最新大片在线看 | 五月婷婷一级片 | 亚洲欧美激情精品一区二区 | 久久久www| 中文字幕在线观看视频一区二区三区 | 在线免费色视频 | 69av在线播放 | 国产专区在线视频 | av电影 一区二区 | 久久激情五月激情 | 久久久精品成人 | 美女网站免费福利视频 | 成人久久久久久久久 | 成人a在线观看高清电影 | 免费色视频网址 | 91精品人成在线观看 | 一区二区三区三区在线 | 九九在线播放 | 国产理论影院 | 国产午夜小视频 | 久久久久久久久影院 | 三级av免费看 | 成人免费观看网址 | 日韩精品一区二区三区外面 | 国产一区福利在线 | 丁香 婷婷 激情 | 91精品爽啪蜜夜国产在线播放 | 色噜噜狠狠狠狠色综合久不 | 人人爱在线视频 | 久久久久久国产精品久久 | 国产视频手机在线 | 99久久精品费精品 | 一本一本久久a久久精品综合 | 欧美a级在线播放 | 日韩黄色大片在线观看 | 国产成人精品三级 | 日日操网| 久久久午夜精品福利内容 | 亚洲欧美婷婷六月色综合 | 欧美一区二区免费在线观看 | 天天操天天干天天操天天干 | 日本不卡一区二区 | 99re久久资源最新地址 | 99精品国产一区二区三区麻豆 | 91在线国产观看 | 国产黄色免费 | 日韩有码中文字幕在线 | 91成人免费在线视频 | 久久激情视频 | 国产精品不卡在线观看 | 中文字幕在线观看视频网站 | 中文字幕成人在线 | 91亚州| 亚洲精品播放 | 91精品专区 | 成人国产精品av | 91精品国产99久久久久久久 | 国产美腿白丝袜足在线av | 亚洲视频免费在线看 | 亚洲国产中文字幕 | 99这里只有久久精品视频 | 国产麻豆精品一区 | 国产麻豆成人传媒免费观看 | 永久免费的av电影 | 成年人免费看片 | 在线之家免费在线观看电影 | 欧美日韩在线观看不卡 | 国产福利专区 | 一级欧美日韩 | 日日操网 | 草久久久久久久 | 国产精品一区二区在线免费观看 | 五月天色综合 | 日韩簧片在线观看 | 欧美日韩性视频 | 中文字幕影片免费在线观看 | 亚洲伊人av | 日韩精品欧美视频 | 亚洲视频在线视频 | 精品国产电影一区 | 涩涩色亚洲一区 | 在线av资源| 久久av免费 | 成人一级免费电影 | 天天干,天天射,天天操,天天摸 | 亚洲精品国产欧美在线观看 | 欧美日韩视频在线一区 | 国产精品一级视频 | 亚洲精区二区三区四区麻豆 | 免费观看国产视频 | 国产中文字幕在线播放 | 成人毛片网 | 99亚洲精品 | 在线一二区 | 黄色免费观看 | a级国产乱理论片在线观看 特级毛片在线观看 | 久久综合久久伊人 | 色姑娘综合网 | 在线看一区二区 | 成 人 免费 黄 色 视频 | 波多在线视频 | 波多野结衣资源 | 在线黄网站 | 午夜精品视频免费在线观看 | 福利视频 | 国产999在线观看 | 久操视频在线免费看 | 国产麻豆剧果冻传媒视频播放量 | av中文在线播放 | 超碰97在线资源 | 永久免费观看视频 | 久久久激情网 | 97精产国品一二三产区在线 | 久草五月 | 国色天香在线 | 99国内精品 | 成年人在线免费看视频 | 国产精品第十页 | 亚洲精选在线观看 | 黄色毛片视频免费 | 天天插伊人 | 在线观看视频国产 | 国产精品日韩在线观看 | 久久视频免费看 | 日韩字幕 | 亚洲一区 av | 天天干夜夜| 91影视成人| 国产 字幕 制服 中文 在线 | 日韩精品视频在线免费观看 | 亚洲精品合集 | 久久国产免 | 伊人看片 | 亚洲午夜精| 亚洲精品国产片 | 综合黄色网| 国产精品视频资源 | 欧美日韩视频在线一区 | 亚洲精品动漫久久久久 | 精品国产不卡 | 欧美国产视频在线 | 国产呻吟在线 | 天天干天天操天天拍 | 国产美女精彩久久 | 久久精品aaa| 91一区啪爱嗯打偷拍欧美 | 成人a级网站 | 国产精品毛片久久久 | 成人国产网站 | 日韩二区三区 | 欧美日韩在线观看一区二区三区 | 久久精品资源 | 91热视频在线观看 | 97超碰免费 | 男女啪啪免费网站 | 麻豆精品视频在线观看免费 | 日韩精品视频免费 | 久久精品国产成人精品 | 在线免费91 | 美女一级毛片视频 | 在线看v片成人 | 夜夜视频欧洲 | 久久激情视频 久久 | 国产在线va | 成片免费观看视频大全 | 国产成人精品女人久久久 | 伊人久久国产精品 | 91精品中文字幕 | 91热视频在线观看 | 91在线免费观看网站 | 日韩免费观看视频 | 精品国自产在线观看 | 中文国产字幕 | 久草资源免费 | 欧美日韩国产二区三区 | 日韩视频免费 | 亚洲在线免费视频 | 九九在线视频免费观看 | av看片网 | 亚洲区精品视频 | 波多野结衣视频在线 | 欧美一进一出抽搐大尺度视频 | 欧美伦理一区 | 91在线看片 | 美女在线黄| 天天摸天天操天天爽 | 亚洲经典视频 | 日韩字幕在线 | 婷婷av在线 | 亚洲另类xxxx | 免费a一级 | 国产午夜精品久久 | 亚欧洲精品视频在线观看 | 91黄站| 亚洲一级二级 | 成人av在线播放网站 | 99电影| 黄污视频网站大全 | 成人网在线免费视频 | 在线天堂中文在线资源网 | 日韩高清国产精品 | av片一区| 亚洲精品国产高清 | 国产一级性生活 | 欧美一级欧美一级 | 国内一区二区视频 | a色网站 | 91免费版在线观看 | 国产日韩精品在线观看 | 一区二区三区在线视频111 | 视频一区二区在线观看 | 日韩理论视频 | 久久精品久久99精品久久 | 欧美国产91 | 国产福利不卡视频 | 欧美韩日视频 | 国产69精品久久99不卡的观看体验 | 国产尤物在线 | 99亚洲精品在线 | 7799av| 日本黄色免费播放 | 97超碰成人在线 | 99草视频 | 五月天激情综合网 | 亚洲 欧美 另类人妖 | 在线成人性视频 | 国产在线视频一区二区三区 | 亚洲国产精品电影 | 成人黄色av免费在线观看 | 亚洲黄色免费网站 | 综合久久久久久 | 国产日韩精品在线观看 | 成人av电影免费在线播放 | 99精品在这里 | 亚洲欧美成人在线 | 久久久.com| 91污在线观看 | 日韩二区在线播放 | 亚洲 欧美日韩 国产 中文 | 欧美精品久久久久a | 亚色视频在线观看 | 丝袜一区在线 | 国产一级在线观看视频 | 国产精品久久婷婷六月丁香 | 亚洲在线成人精品 | 69国产精品视频免费观看 | www.91av在线 | 午夜视频一区二区 | 九九热精| 亚洲欧洲一区二区在线观看 | 免费网站看v片在线a | 草久在线观看 | 久久99热这里只有精品 | 国产精品网在线观看 | 久久久亚洲国产精品麻豆综合天堂 | 免费福利视频网站 | 伊人春色电影网 | 国产在线永久 | 国产精品成人免费精品自在线观看 | 国产免费久久av | 国产一区二区观看 | 中文字幕在线观看视频一区 | 一级黄色网址 | 操处女逼 | 日韩精品欧美一区 | 久久99久久久久久 | 国产一区二区不卡视频 | 中文字幕精 | 高清日韩一区二区 | 久久久久国产一区二区三区 | 成人免费观看电影 | 99电影 | 亚洲精品资源在线观看 | 日韩电影中文字幕 | 在线观看亚洲精品视频 | 精品福利在线视频 | 久久99国产综合精品免费 | 91精品久久久久久久99蜜桃 | 中文字幕二区三区 | 91视频免费看片 | 日韩激情av在线 | 国产精品国产三级国产aⅴ无密码 | 精品黄色片 | 国产精品久久久久久久久久尿 | 欧美日韩中文国产一区发布 | 97色在线观看 | 国产午夜一区二区 | 亚洲伦理中文字幕 | 西西www444| 色成人亚洲 | 国产 日韩 在线 亚洲 字幕 中文 | 日韩一级黄色大片 | 国产一区二区不卡在线 | 日韩激情视频在线观看 | 久久久精品国产一区二区电影四季 | 成人h动漫精品一区二 | 亚洲天天在线 | 成人97人人超碰人人99 | 麻豆久久| 99久热在线精品视频 | 欧美日韩精品在线一区二区 | 亚洲在线看 | 亚洲高清视频在线观看 | 久久全国免费视频 | 国产精品亚洲视频 | 最近中文字幕在线 | 日本不卡123 | www免费看 | 天天综合操 | 国产精品video爽爽爽爽 | 51久久夜色精品国产麻豆 | 欧美激情视频一区二区三区 | 99在线高清视频在线播放 | 久久久久国产精品一区二区 | 综合网在线视频 | 亚洲国产视频网站 | 久久精品日本啪啪涩涩 | 国内精品久久久久久久久久久久 | 天堂麻豆 | 国产精品久久久网站 | 精品视频免费观看 | 在线精品观看国产 | 久久久穴 | 国产精品久久一区二区三区, | 亚洲精品乱码白浆高清久久久久久 | 国产成人亚洲在线观看 | 91在线看片 | 国产视频在线免费观看 | 久久国产精品99国产精 | 丁香av| 91视频在线播放视频 | 四虎永久国产精品 | 国产一区不卡在线 | 国产99久久精品一区二区300 | 丁香婷婷综合色啪 | 欧美大片在线看免费观看 | 在线v片 | 日韩精品偷拍 | 欧美激情视频一二三区 | 91香蕉视频 mp4 | 日本91在线 | 黄免费网站 | 欧美特一级| 麻豆免费视频 | 91免费看片黄 | 天天爽人人爽夜夜爽 | 亚洲黄色免费 | 国产精品久久精品国产 | 日韩大片在线观看 | 成人午夜久久 | 欧洲精品久久久久毛片完整版 | 久久久18 | 激情丁香| 高清av在线 | 在线免费看片 | 国产美女精品视频 | 狠狠躁夜夜av | 久久这里只有精品久久 | 午夜精品久久久久 | www.91成人 | 国产视频一区在线播放 | 狠狠躁夜夜躁人人爽超碰97香蕉 | 久久久www成人免费毛片麻豆 | 国内久久看 | 精品福利视频在线观看 | 国产一级三级 | 91你懂的 | 久久久久久久免费观看 | 日日干,天天干 | 在线看片中文字幕 | 日本中文字幕电影在线免费观看 | 在线精品亚洲一区二区 | 精品99久久久久久 | 日韩av专区| a级片久久久| 99视频在线精品免费观看2 | 亚洲黄色免费观看 | 97精品国自产拍在线观看 | 欧美看片 | 91精品免费在线 | 国产69久久| 97网| 97人人爽 | 久久精品视频免费播放 | 成人av免费在线 | 天天夜夜亚洲 | av黄色影院 | 超碰97公开 | 在线免费观看黄网站 | 国产最顶级的黄色片在线免费观看 | 久久在线免费视频 | 黄色毛片在线观看 | 美女视频黄网站 | 天天操操操操操 | 麻豆播放| www.黄色片网站 | 亚洲春色成人 | www,黄视频 | 久久精品欧美日韩精品 | 国产精品久一 | 人人舔人人舔 | 国产成人一区二区在线观看 | 美女视频黄免费网站 | 久草久草在线 | 日韩av中文 | 人人爱爱 | 国产日韩在线视频 | 亚洲综合干 | 欧美日韩大片在线观看 | 免费观看黄色av | 欧美在线观看视频一区二区三区 | 超碰免费公开 | av不卡网站 | 夜夜嗨av色一区二区不卡 | 狠狠色丁香婷婷综合基地 | 91电影福利 | 人人干干人人 | www.99热精品 | av在线之家电影网站 | 天天综合入口 | 国产高清免费在线观看 | av综合av| 国产成人一区二区在线观看 | 999成人免费视频 | 中文字幕免费成人 | 国产亚洲视频中文字幕视频 | 五月天网站在线 | 国产成人精品一区二区三区网站观看 | 精品久久久久久亚洲 | 网站免费黄色 | 欧美男女爱爱视频 | 久久精品国产免费看久久精品 | 麻豆传媒在线免费看 | 日本三级全黄少妇三2023 | 日批网站在线观看 | 国产精品视频地址 | 中文字幕精品三区 | 国产黑丝一区二区 | 天堂av观看 | 国产精品去看片 | 香蕉久久国产 | 成人午夜电影在线播放 | 在线亚洲精品 | 色婷婷色| 日韩一级理论片 | 黄色三级在线 | 久久国产精品区 | 黄色视屏免费在线观看 | 天天操天天操天天操天天操天天操天天操 | 亚洲欧美日韩一级 | 中文字幕在线视频一区二区三区 | 丰满少妇在线观看资源站 | 亚洲码国产日韩欧美高潮在线播放 | 国产中文在线视频 | 91视频啪 | 免费成人av | 永久免费精品视频网站 | 少妇搡bbbb搡bbb搡忠贞 | 911久久| 玖玖在线资源 | 久久精品免费观看 | 毛片黄色一级 | 久久久香蕉视频 | 婷婷www | 亚洲一区二区三区毛片 | 日本在线观看中文字幕无线观看 | 四虎影视成人永久免费观看视频 | 成人中文字幕在线 | 国产三级香港三韩国三级 | 亚洲精品大全 | 亚洲国产成人在线观看 | 在线观看成人一级片 | 久久电影色 | 国产成年免费视频 | 午夜久久电影网 | 热99在线 | 91香蕉视频黄 | 亚洲精品综合一二三区在线观看 | 中文字幕欧美日韩va免费视频 | 六月丁香婷婷久久 | 欧美色精品天天在线观看视频 | 国产精品美女久久久免费 | 在线播放视频一区 | 日韩精品欧美一区 | 亚洲成av人片在线观看无 | 亚洲 欧美 变态 国产 另类 | 在线精品在线 | 欧美十八 | 91精品在线播放 | 综合久久久久久久久 | 国产精品久久久久久久久久免费 | 国产一级免费电影 | 日本99久久| 亚洲妇女av | 四虎8848免费高清在线观看 | 精品国产电影一区二区 | 亚洲专区一二三 | 国产精品一区在线播放 | 亚洲天堂网在线视频 | 九九热久久久 | 国产成人免费av电影 | 黄色一集片| 日韩成人精品一区二区三区 | 免费在线观看日韩 | 国产精品一区在线观看你懂的 | 日韩精品中文字幕一区二区 | 亚洲精品高清在线 | 天天操天天摸天天射 | 91精品国产高清自在线观看 | 91大神在线观看视频 | www久久精品 | 视频二区在线 | 久久婷婷精品 | 亚洲免费观看视频 | 国产日韩在线看 | 黄色精品一区二区 | 三级在线视频观看 | 91九色国产视频 | 日韩视频在线不卡 | 视频在线在亚洲 | 国产九九在线 | 国产精品免费观看久久 | 国产精品久久一区二区无卡 | 黄色影院在线播放 | 国产xxxx做受性欧美88 | 亚洲国产精品成人va在线观看 | 亚洲电影在线看 | 午夜视频在线观看欧美 | 亚洲国产三级在线 | 涩涩资源网 | 久久 地址| 久久久福利 | 91色九色 | 国产一级特黄毛片在线毛片 | 日韩网站在线观看 | 精品国产一二区 | 久久精品成人欧美大片古装 | 超碰97免费在线 | 天堂网一区二区 | 精品国产一二区 | 亚洲最新av在线网址 | 在线观看岛国片 | 成年人在线看视频 | 日本激情视频中文字幕 | 91人人爽久久涩噜噜噜 | 一级黄色大片在线观看 | 日韩精品中文字幕在线播放 | 亚洲免费精彩视频 | 婷婷久久久久 | 日本精品一区二区三区在线播放视频 | 一区二区三区久久精品 | 国产69精品久久99的直播节目 | 亚洲国产视频直播 | 日韩在线观看的 | 免费av成人在线 | 中文字幕乱码在线播放 | 美女露久久| 97人人人人 | 蜜桃麻豆www久久囤产精品 | 国产九九九精品视频 | 中文字幕中文中文字幕 | 久久字幕网 | 欧美日韩在线观看视频 | 天天爱天天干天天爽 | 午夜视频免费在线观看 | 美女免费网站 | 福利av影院 | 国产成人免费在线 | 中文字幕区 | 午夜免费福利视频 | 国产精品大片 | 黄色片网站大全 | 国产一区在线观看免费 | 国产专区视频 | 狠狠干夜夜操天天爽 | 成人在线你懂得 | 麻豆免费视频网站 | 日本性视频| 超碰av在线播放 | 成年人网站免费观看 | 国产精品18久久久久久首页狼 | 精品999在线 | 成人av影院在线观看 | 中文字幕在线观看亚洲 | 丁香六月色 | 97精品国产97久久久久久 | 国产精品黄 | 久久不卡av | 久久图 | 国产精品入口66mio女同 | 天天综合五月天 | 在线观看国产中文字幕 | 亚洲va欧美va人人爽春色影视 | 亚欧日韩成人h片 | 美女免费电影 | 91看片淫黄大片一级在线观看 | 91最新中文字幕 | 国产成人精品亚洲精品 | 国产伦精品一区二区三区四区视频 | 久久久久久久久久久久av | 亚洲精品中文字幕视频 | 欧美日韩久久 | 中文字幕影视 | 97人人爽人人 | 操久久免费视频 | 99久久精品国产观看 | 久久久受www免费人成 | 超黄视频网站 | 深夜福利视频一区二区 | 九九免费在线观看 | 99精品乱码国产在线观看 | 色婷婷狠狠 | 中文字幕在线中文 | 超碰在线观看av | 麻豆久久一区 | 91精品资源 | 在线免费观看黄色 | 欧美日韩性生活 | 亚洲国产精彩中文乱码av | 91久久久久久久 | 热久久免费视频精品 | 天天爽天天爽夜夜爽 | 在线免费观看黄色大片 | 欧美日韩国产一区二区在线观看 | 一级黄毛片 | 中文字幕在线观看免费高清完整版 | 91成人在线看 | 国产精品久久久久久久久久免费 | 国产精品激情在线观看 | 亚洲欧美综合精品久久成人 | 亚洲精品乱码久久久久久按摩 | 欧美精品一二 | 干天天 | 亚洲国产剧情av | 精品99免费 | 丁香婷婷自拍 | 国产一在线精品一区在线观看 | 国语黄色片 | 久久久亚洲网站 | 亚洲精品动漫在线 | 五月天com| 久久成人在线 | 国产一级二级在线 | 黄色三级免费看 | 在线 影视 一区 | 日日干网| 久久久久久网站 | 久久亚洲私人国产精品va | 中文字幕在线日亚洲9 | 国产三级午夜理伦三级 | 五月天婷婷视频 | 国产成人久久av977小说 | 久久精品国产免费看久久精品 | 丁香久久久 | 欧美日韩国产在线精品 | 成人免费网站视频 | 日韩av伦理片 | 成人羞羞视频在线观看免费 | 国产精品久久99综合免费观看尤物 | 2023av| 国产亚洲精品久久久久久无几年桃 | 五月天色丁香 | 成人h动漫精品一区二 | 日本黄色免费网站 | 亚洲国产一区二区精品专区 | 亚洲v欧美v国产v在线观看 | 久久这里只有精品久久 | 在线亚洲精品 | 久久久久久久久久久高潮一区二区 | 天天干天天摸天天操 | 久久久久久国产一区二区三区 | 国产精品美女久久久久久久 | 成年人国产视频 | 欧美一级大片在线观看 | 99久久精品网 | 91九色蝌蚪在线 | 日本福利视频在线 | 精品一区二区在线免费观看 | 日本激情视频中文字幕 | 亚洲电影黄色 | 日韩大陆欧美高清视频区 | 国产精品二区在线观看 | 欧美日韩高清在线 | 日韩大片在线播放 | 日韩理论在线播放 | 亚洲 av网站 | 69热国产视频 | 久久久久久久久久福利 | 在线看岛国av | 国产成人精品一区二区三区在线观看 | 日本精品视频在线观看 | 一区久久久 | 国产第一页福利影院 | 亚洲第一伊人 | 国产黄色免费看 | 久久一区91| 一二三区av| 国产精品福利在线播放 | 国产一级二级av | 日日婷婷夜日日天干 | 成年人电影免费在线观看 | 亚洲国产精品999 | 免费日p视频 | 日韩欧美一区二区三区免费观看 | 99在线精品免费视频九九视 | 九热精品 | 97在线观看免费高清 | 久久国产精品系列 | 香蕉国产91 | 九九日韩| 亚洲性视频 | 在线观看成人网 | 国产手机视频在线播放 | 在线免费观看一区二区三区 | 久久久久久久久久电影 | 欧美乱淫视频 | 久久久久久久99精品免费观看 | 亚洲v欧美v国产v在线观看 | 婷婷综合在线 | 亚洲日日射 | 国产午夜三级一区二区三桃花影视 | 99re在线视频观看 | 天天操天天射天天操 | 天天干天天拍 | 国产精品一区二区av麻豆 | 欧美成人区 | 五月天综合激情 | 中文字幕电影在线 | 国产在线999 | 欧美成人亚洲 | 99精品国产在热久久下载 | 国产精品久久久久久久久久ktv | 久久乐九色婷婷综合色狠狠182 | 激情久久一区二区三区 | 看片网站黄色 | 欧美日韩免费网站 | 中文字幕 国产精品 | 婷婷色中文 | 色综合久久精品 | 亚洲免费在线观看视频 | 一区二区三区日韩视频在线观看 | 亚洲永久精品视频 | 91精品国自产在线观看 | 国产精品一区免费看8c0m | 五月婷婷毛片 | 亚洲作爱视频 | 亚洲视频免费在线观看 |