【问题标题】:How to write Greasemonkey scripts for Chrome so that you can unit-test it?如何为 Chrome 编写 Greasemonkey 脚本以便对其进行单元测试?
【发布时间】:2012-04-04 17:58:55
【问题描述】:

我正在编写一个 Greasemonkey 用户脚本,它应该使用 jQuery 并在 Google Chrome 和 Firefox 上工作。

我已经看到了几个如何做到这一点的例子,包括关于 SO 的非常好的答案。所有这些都归结为调用一个“注入脚本”函数,传递另一个回调函数作为参数。

回调函数内部的代码是“神奇”发生的地方,包括访问jQuery ($) 对象。

此解决方案运行良好。但是,使用它的后果之一是定义在回调函数之外的函数不能从它内部调用:

function doSomethingImportantThatIWantToUnitTest(){ ... }

function with_jquery(callback) {
    var script = document.createElement("script");
    script.type = "text/javascript";
    script.textContent = "(" + callback.toString() + ")(jQuery)";
    document.body.appendChild(script);
};

with_jquery(function ($) {
    doSomethingImportantThatIWantToUnitTest(); // <---- meh. Not defined!
});


所以,我只能使用在回调函数里面定义的函数。但反过来,这些函数又不能从外部调用。特别是,例如,它们不能从单元测试中调用,这对我来说非常烦人。

有没有办法为 Chrome 编写 Greasemonkey 脚本并对其进行单元测试?

【问题讨论】:

  • 内容脚本和页面范围之间有严格的区分。是什么阻止你也注入单元测试?
  • 您的问题相当令人困惑,因为您谈论的是单元测试和用户脚本,但是当您深入了解问题的细节时,您谈论的是无法从特定范围访问功能。功能和范围的问题只是一个 javascript 问题,而不是特定于用户脚本或单元测试...也许您应该更改标题和您要问的问题以更能反映您的具体问题?

标签: jquery unit-testing google-chrome greasemonkey userscripts


【解决方案1】:

你应该能够将任何你想要的东西传递给回调函数,包括函数变量。

var f = function doSomethingImportantThatIWantToUnitTest(){ ... }

function with_jquery(callback) {
    var script = document.createElement("script");
    script.type = "text/javascript";
    script.textContent = "(" + callback.toString() + ")(jQuery,f)";
    document.body.appendChild(script);
};

with_jquery(function ($, f) {
    f(); // <---- DEFINED!
});

如果你有多个函数想要做,并且不想在几个不同的地方更新代码,你可以传入一个对象或数组,其中包含所有函数作为对象属性或元素一个数组。

虽然如果是我,我只会在你使用它们的范围内定义函数。

【讨论】:

  • 定义“工作”。 doSomethingImport... aka f 未在页面范围内定义(假定为 )(jQuery,f))。请注意:在内容脚本 (Chrome) 中,在内容脚本中定义的方法不可用于注入脚本。
猜你喜欢
  • 1970-01-01
  • 2017-10-16
  • 2016-06-20
  • 2013-09-11
  • 1970-01-01
  • 2014-06-26
  • 1970-01-01
  • 1970-01-01
  • 2010-10-28
相关资源
最近更新 更多