2014-02-27 29 views
9

當談到刺探jQuery的功能(例如bindclick等)很容易:

spyOn($.fn, "bind"); 

問題是,當你想偵察$('...')並返回定義的元素數組。

spyOn($.fn, "init").andReturn(elements); // works, but breaks stuff that uses jQuery selectors in afterEach(), etc 
spyOn($.fn, "merge").andReturn(elements); // merge function doesn't seem to exist in jQuery 1.9.1 
spyOn($.fn, "val").andReturn(elements); // function never gets called 

那麼,如何做到這一點:

事情閱讀SO等相關答案後試過嗎?或者如果唯一的方法是窺探init函數當我這樣做時,我如何從函數「刪除」間諜afterEach()路由不會中斷。

jQuery版本是1.9.1。

解決方法:

我可以使它至今(醜陋的)工作的唯一方法:

realDollar = $; 
try { 
    $ = jasmine.createSpy("dollar").andReturn(elements); 
    // test code and asserts go here 
} finally { 
    $ = realDollar; 
} 

回答

8

通常情況下,間諜存在規範的壽命。然而,摧毀間諜沒有什麼特別之處。你只需恢復原來的功能參考,就是這樣。

這是一個方便的小幫助函數(帶有測試用例),它將清理您的解決方法並使其更加可用。撥打afterEach中的unspy方法恢復原始參考。

function spyOn(obj, methodName) { 
    var original = obj[methodName]; 
    var spy = jasmine.getEnv().spyOn(obj, methodName); 
    spy.unspy = function() { 
     if (original) { 
      obj[methodName] = original; 
      original = null; 
     } 
    }; 
    return spy; 
} 

describe("unspy", function() { 
    it("removes the spy", function() { 
     var mockDiv = document.createElement("div"); 
     var mockResult = $(mockDiv); 

     spyOn(window, "$").and.returnValue(mockResult); 
     expect($(document.body).get(0)).toBe(mockDiv); 

     $.unspy(); 

     expect(jasmine.isSpy($)).toEqual(false); 
     expect($(document.body).get(0)).toBe(document.body); 
    }); 
}); 

作爲上述的替代方案(以及其他人閱讀本文),您可以改變您接近問題的方式。而不是窺探$函數,嘗試將原始調用提取到$以自己的方法,並從中窺探。

// Original 
myObj.doStuff = function() { 
    $("#someElement").css("color", "red"); 
}; 

// Becomes... 
myObj.doStuff = function() { 
    this.getElements().css("color", "red"); 
}; 

myObj.getElements = function() { 
    return $("#someElement"); 
}; 

// Test case 
it("does stuff", function() { 
    spyOn(myObj, "getElements").and.returnValue($(/* mock elements */)); 
    // ... 
}); 
+1

謝謝Eric。我使用'無法'方法,它工作正常。 – parxier

1

通過窺視窗口本身,您可以訪問任何窗口屬性。 由於Jquery就是其中之一,你可以輕鬆地將它嘲笑爲下面的內容並返回你需要的值。

spyOn(window, '$').and.returnValue(mockElement); 

或者添加callFake與輸入,如果它需要是動態的。

+1

這是一個僅限代碼的答案。僅有代碼的答案可能有效,但會自動標記爲低質量。請爲此代碼的工作原理添加簡短說明,或者錯誤是什麼。 - [來自評論](https://stackoverflow.com/review/low-quality-posts/17604477) –

+0

評論編輯以解釋代碼 –