5

我正在尝试测试一个调用 window.location.search 的简单函数。我试图了解如何存根此调用,以便我可以返回我选择的 url。

功能:

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, " "))

测试用例:

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)

我最初的尝试是直接返回一个值,如下所示:

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

这当然行不通。我认为我没有正确指定存根,但它显示了我的意图。

任何有关如何解决此问题的想法将不胜感激。

4

2 回答 2

6

因此,如前所述,您不能直接模拟 window.location 。mylib.search 包装器的想法也不适用于我的情况。所以,我所做的就是将我的调用window.location.search分解为它自己的函数。我的新课程如下所示:

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

然后在我的测试用例中,我用我的测试代码替换函数,如下所示:

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")

对于那些不阅读 Coffeescript 的人,下面列出了等效的 javascript 代码:

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);
});

就像我平常使用 Javascript 的经验一样。可行的解决方案并不像到达那里的旅程那么痛苦。非常感谢您的评论和贡献。

于 2012-08-15T15:20:07.233 回答
2

更新:window.location似乎有点特殊,请参阅此讨论:https ://groups.google.com/forum/?fromgroups#!topic/sinonjs/MMYrwKIZNUU%5B1-25%5D

解决此问题的最简单方法是编写一个包装函数window.location,并存根:

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

在你的测试中:

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

原始答案:

尝试这个:

sinon.stub(window.location, 'search').returns("myUrl")
于 2012-08-14T20:50:29.660 回答