請注意這是專門針對使用Jasmine的測驗環境的。我在開發模式中沒有遇到這些問題。這是我創建的一個最基本的例子:
代碼
代碼
function mountTest() {
$(document).on("click"/span>, " 。 test", function() {
console.log(">> clicked test" )
})
}
規格代碼
fdescribe("test click test"/span>, function() {
beforeEach(function() {
test_btn = affix(" .test")
mountTest() /******************** KEY LINE ****************/)
})
describe("1st spec"/span>, function() {
beforeEach(function() {
console.log(">>1"/span>)
test_btn.click()
})
it("shoudl work", function() {
})
})
describe("2nd spec", function() {
beforeEach(function() {
console.log(">>2"/span>)
test_btn.click()
})
it("shoudl work", function() {
})
})
describe("3rd spec", function() {
beforeEach(function() {
console.log(">>3"/span>)
test_btn.click()
})
it("shoudl work", function() {
})
describe("4th spec", function() {
beforeEach(function() {
console.log(">>4"/span>)
test_btn.click()
})
it("shoudl work", function() {
})
})
})
})
按照目前的情況,控制臺的輸出是這樣的:
>>1
>> 點擊了測驗
>>2 >>點擊測驗
>> 點擊了測驗
>>點擊了測驗
>>3 >>點擊測驗>>點擊測驗
>>點擊了測驗
>>點擊了測驗
>>點擊了測驗
>>3 >>點擊測驗 >>點擊測驗 >>點擊測驗
>>點擊了測驗
>>點擊了測驗
>>點擊了測驗
>>點擊了測驗
>>4
>>點擊了測驗
>>點擊了測驗
>>點擊了測驗
>>點擊了測驗
我發現,造成點擊量冗余的原因是mountTest()在頂層的beforeEach被呼叫。進一步的實驗發現,如果mountTest()在一個describe塊中被呼叫,該塊是一個規格(1,2,3,4),那么在mountTest()被放置的第一個規格之后的所有規格的冗余被移除。例如
修改后的規范代碼
fdescribe("test click test"/span>, function() {
beforeEach(function() {
test_btn = affix(" .test")
})
describe("1st spec", function() {
beforeEach(function() {
console.log(">>1"/span>)
test_btn.click()
})
it("shoudl work", function() {
})
})
describe("2nd spec", function() {
beforeEach(function() {
console.log(">>2"/span>)
mountTest() /******************** KEY LINE ****************/
test_btn.click()
})
it("shoudl work"/span>, function(){
})
})
describe("3rd spec", function() {
beforeEach(function() {
console.log(">>3"/span>)
test_btn.click()
})
it("shoudl work", function() {
})
describe("4th spec", function() {
beforeEach(function() {
console.log(">>4"/span>)
test_btn.click()
})
it("shoudl work", function() {
})
})
})
})
控制臺輸出
>> 1
>>2。
>>點擊了測驗
>>3 >>點擊測驗
>> 點擊了測驗
>>3>點擊測驗
>> 點擊了測驗
>>4 >>點擊測驗
>> 點擊了測驗
多余的東西沒有了。第一個規格沒有觸發任何點擊,因為mountTest()直到第二個規格才被呼叫。
有人能向我解釋這種行為嗎?我甚至不知道我在這里誤解了什么......是affix的性質還是beforeEach的性質?
下面是我在看這個問題時的一些疑問:
在修改后的規格例子中,如果mountTest()只在第2個規格的describe塊中被呼叫,為什么第3/4個規格的點擊會起作用?mountTest()是如何翻譯過來的?我唯一的想法是,不知何故,affix(".test")元素保留了由mountTest()添加的eventHandler,但根據jasmine-fixture檔案(https://github.com/searls/jasmine-fixture),affix在每個規格之后都會清理自己的元素?
在最初的規格例子中,我認為對點擊如此多余的解釋是:mountTest()到第N個規格時已經掛載了N次,所以在第N個規格時,每個點擊都為每個掛載注冊一次,所以你會得到第N次點擊。但與#1重疊的是,如果affix(".test")元素每次都是新的,那么你每次都在掛載一個新的物件,所以它應該只觸發一次,不是嗎?
FWIW,為了測驗這個詞綴,我確實手動撰寫了一個 afterEach(function() { $(".test").remove() }) 并在原始規范代碼中的每個 it 期望塊之后添加它,而這完全沒有解決這個問題。
相關的 gemfile:
gem 'jasmine', "2.6"
gem 'jasmine-jquery-rails' #決議為2.03。
然后還jasmine-fixture通過檔案spec > javascripts > helpers > jasmine-fixture.min.js進行加載,這是因為在spec > javascripts > support > jasmine.yml檔案中,有一行:
src_files:
...
helpers。
- 'helpers/**/*.js'。
uj5u.com熱心網友回復:
@MinusFour 回答正確,我接受了,為了流程,我只想根據解釋 評論,澄清兩個可能的答案,這兩個答案是可行的。
選項A:
describe("test click test"/span>, function() {
beforeEach(function() {
test_btn = affix(" .test")
})
beforeAll(function(){
mountTest()
})
....
選項B:
describe("test click test"/span>, function() {
beforeEach(function() {
test_btn = affix(" .test")
mountTest()
})
afterEach(function(/span>) {
$(document).off()
})
....
uj5u.com熱心網友回復:
問題是監聽器被附在檔案上,而不是被affix管理的元素上。這就是為什么監聽器沒有被移除,以及為什么手動移除該元素也沒有任何作用。你需要把它直接附加到創建的元素上。你可以這樣做:
function mountTest(el) {
el.on("click", function(>/span>) {
console.log(">> clicked test"/span>)
})
}
然后這樣呼叫:
beforeEach(function(/span>) {
test_btn = affix(" .test")
mountTest(test_btn)。
})
這將直接附加在元素上,而不是在document上。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/310295.html
標籤:
上一篇:如何測驗JFrame的大小變化?
下一篇:布尼特2路捆綁
