在 Javascript 中模拟 window.location.href

新手上路,请多包涵

我对使用 window.location.href 的函数进行了一些单元测试——这并不理想,我宁愿将其传入,但在实现中是不可能的。我只是想知道是否可以在不实际导致我的测试运行程序页面实际转到 URL 的情况下模拟这个值。

   window.location.href = "http://www.website.com?varName=foo";
  expect(actions.paramToVar(test_Data)).toEqual("bar");

我在我的单元测试框架中使用茉莉花。

原文由 wmitchell 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 718
2 个回答

您需要模拟本地上下文并创建自己的版本 windowwindow.location 对象

var localContext = {
    "window":{
        location:{
            href: "http://www.website.com?varName=foo"
        }
    }
}

// simulated context
with(localContext){
    console.log(window.location.href);
    // http://www.website.com?varName=foo
}

//actual context
console.log(window.location.href);
// http://www.actual.page.url/...

如果您使用 with 那么所有变量(包括 window !)将首先从上下文对象中查找,如果不存在则从实际上下文中查找。

原文由 Andris 发布,翻译遵循 CC BY-SA 2.5 许可协议

最好的方法是在某处创建一个辅助函数,然后模拟它:

  var mynamespace = mynamespace || {};
    mynamespace.util = (function() {
      function getWindowLocationHRef() {
          return window.location.href;
      }
      return {
        getWindowLocationHRef: getWindowLocationHRef
      }
    })();

现在不要在代码中直接使用 window.location.href,只需使用它即可。然后,只要您需要返回模拟值,就可以替换此方法:

 mynamespace.util.getWindowLocationHRef = function() {
  return "http://mockhost/mockingpath"
};

如果您想要窗口位置的特定部分(例如查询字符串参数),那么也可以为此创建辅助方法并将解析排除在主代码之外。一些框架如 jasmine 有测试间谍,不仅可以模拟函数返回所需的值,还可以验证它是否被调用:

 spyOn(mynamespace.util, 'getQueryStringParameterByName').andReturn("desc");
//...
expect(mynamespace.util.getQueryStringParameterByName).toHaveBeenCalledWith("sort");

原文由 Kurt Harriger 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题