2012-08-14 25 views
5

Tôi đang cố thử nghiệm một hàm đơn giản thực hiện lệnh gọi window.location.search. Tôi đang cố gắng tìm hiểu cách thực hiện cuộc gọi này để tôi có thể trả lại url mà tôi chọn.sinon stub cho window.location.search

chức năng:

getParameterByName: (name) =>  
    name = name.replace(/[\[]/, "\\\[").replace(/[\]]/, "\\\]") 
    regexS = "[\\?&]" + name + "=([^&#]*)" 
    regex = new RegExp(regexS)  
    results = regex.exec(window.location.search) //Stub call to window.location.search 
    if(results == null) 
    return "" 
    else 
    return decodeURIComponent(results[1].replace(/\+/g, " ")) 

Kiểm tra trường hợp:

describe "Data tests",() -> 
    it "Should parse parameter from url",() ->   
    data = new Data() 

    console.log("search string: " + window.location.search) //prints "search string:" 
    window.location.search = "myUrl" 
    console.log("search string: " + window.location.search) //prints "search string:" 
    console.log(data.getParameterByName('varName')) 

    expect(true).toBe(true) 

nỗ lực ban đầu của tôi là trả lại một giá trị trực tiếp như vậy:

sinon.stub(window.location.search).returns("myUrl") 

này, tất nhiên, không công việc. Tôi không nghĩ rằng tôi đang xác định sơ khai một cách chính xác, nhưng nó cho thấy ý định của tôi.

Bất kỳ ý tưởng nào về cách giải quyết vấn đề này sẽ được đánh giá cao.

Trả lời

6

Vì vậy, như đã đề cập trước đó, bạn không thể window.location giả trực tiếp. Cũng không làm các ý tưởng wrapper mylib.search làm việc với tình hình của tôi. Vì vậy, những gì tôi đã làm là phá vỡ cuộc gọi của tôi để window.location.search vào chức năng riêng của mình. lớp mới của tôi trông giống như vậy:

getParameterByName: (name) => 
    console.log("name: #{name}") 
    name = name.replace(/[\[]/, "\\\[").replace(/[\]]/, "\\\]") 
    regexS = "[\\?&]" + name + "=([^&#]*)" 
    regex = new RegExp(regexS) 
    results = regex.exec(@getWindowLocationSearch()) 
    if(results == null) 
    return "" 
    else 
    return decodeURIComponent(results[1].replace(/\+/g, " ")) 

getWindowLocationSearch:() => 
    window.location.search 

Sau đó, trong trường hợp thử nghiệm của tôi, tôi thay thế các chức năng với mã thử nghiệm của tôi như sau:

describe "Data tests",() -> 
    it "Should parse parameter from localhost url",() -> 
    goodUrl = "http://localhost:3333/?token=val1" 

    Data::getWindowLocationSearch =() -> return goodUrl 
    unit = new Data() 
    result = unit.getParameterByName("token") 

    expect(result).toBe("val1") 

Đối với những người không đọc Coffeescript, javascript tương đương mã được liệt kê bên dưới:

it("Should parse parameter from localhost url", function() { 
    var goodUrl, result, unit; 
    goodUrl = "http://localhost:3333/?token=val1"; 
    Data.prototype.getWindowLocationSearch = function() { 
    return goodUrl; 
    }; 
    unit = new Data(); 
    result = unit.getParameterByName("token"); 
    expect(result).toBe("val1"); 
    return expect(true).toBe(true); 
}); 

Như kinh nghiệm thông thường của tôi với Javascript. Giải pháp làm việc gần như không đau đớn như cuộc hành trình đến đó. Cảm ơn bạn rất nhiều vì ý kiến ​​đóng góp của bạn.

2

UPDATE: window.location, có vẻ như, là một chút của một trường hợp đặc biệt, xem thảo luận này: https://groups.google.com/forum/?fromgroups#!topic/sinonjs/MMYrwKIZNUU%5B1-25%5D

Cách đơn giản nhất để giải quyết vấn đề này là để viết một chức năng bao bọc xung quanh window.location, và còn sơ khai rằng:

mylib.search = function (url) { 
    window.location.search = url; 
}; 

Và trong thử nghiệm của bạn:

sinon.stub(mylib, 'search').returns("myUrl") 

ĐÁP ORIGINAL:

Hãy thử điều này:

sinon.stub(window.location, 'search').returns("myUrl") 
+1

Tôi đã thử điều đó trước và tôi lại thử lại: 'TypeError: Đã cố gắng tìm kiếm thuộc tính chuỗi như chức năng ' –

+0

oh xin lỗi,' window.location.search' là một chuỗi không phải là hàm, vì vậy bạn có thể 't stub nó. Thay thế stub bằng một nhiệm vụ: 'window.location.search =" myUrl "'. –

+0

Lạ lùng, thực hiện một giao diện điều khiển.log trước và sau khi kết quả trong một chuỗi trống, vì vậy tôi không chắc chắn những gì đang xảy ra. Nhiệm vụ không gắn bó. Tôi đã cập nhật mã của mình để hiển thị trường hợp thử nghiệm của mình. –

Các vấn đề liên quan