在 Javascript污染全局命名空间通常被认为是一件坏事.这就是为什么Coffeescript将所有Javascript包装在(function(){}).call(this);包装.

但是,我已经开始为我的Coffeescript代码编写QUnit测试,而QUnit抱怨它无法找到我的函数.

1. Died on test #1: getGoodNamePart is not defined
getGoodNamePart is not defined at Object.<anonymous> (file:///Users/kevin/Documents/docs/code/chrome/tests.js:2:10) at Object.run

我想在不污染全局命名空间的情况下测试变量.这样做的好方法是什么?

这是我要测试的生成的Javascript:

(function() {
getGoodNamePart = function(str) {
    if (str.charat(0) === '"') {
      str.replace(/" <[^>]+>$"/g,"");
      str.replace(/"/g,"");
      return str;
    } else if (str.charat(0) === '<') {
      str.replace(/<|>/g,"");
      return str;
    } else {
      return str;
    }
  };
}).call(this);

我的test.js文件是:

test('getGoodNamePart()',function() {
  equals(getGoodNamePart("\"Kev Burke\" <kev@inburke.com>"),"Kev Burke","\"name\" <email> works");
  equals(getGoodNamePart("","","empty string works"));
  equals(getGoodNamePart("kev@inburke.com","kev@inburke.com","raw email works"));
  return equals(getGoodNamePart("<kev@inburke.com>","email inside carets -> carets get stripped"));
});

谢谢,
凯文

解决方法

所以,你说你想测试getGoodNamePart而不污染全局命名空间.但是,CoffeeScript会自动模块化每个文件(有充分理由 – 请参阅 my answer here),这意味着跨文件访问函数的唯一方法是将它们附加到某个全局对象. (我假设我们在这里讨论的是浏览器,而不是Commonjs环境,例如Node.js,你可以在那里使用导出.)

这给你三个选择:

>将getGoodNamePart附加到窗口.这是最简单的,因为唯一需要的更改是将getGoodNamePart添加到窗口前面. (或只是@),但当然这会最大化命名空间污染.
>将getGoodNamePart附加到已附加到窗口或全局的其他内容.
>将您的测试移动到与getGoodNamePart相同的文件中(这是JS世界中的一种不寻常的做法,但值得考虑,因为它保持全局命名空间不变,让您轻松地在代码和测试之间切换).

假设您想要使用#2,将getGoodNamePart等函数导出为纯粹的测试.称他们为“测试目标”.在每个带有测试目标的文件的顶部,添加

window.testTargets ?= {}

当你定义getGoodNamePart时,写

testTargets.getGoodNamePart = getGoodNamePart = (str) ->
  ...

然后在QUnit测试套件的顶部写上

{getGoodNamePart} = testTargets

获得这个功能.

QUnit coffeescript范围的更多相关文章

  1. Ajax负载测试工具

    似乎有很多压力/负载测试工具支持AJAX.我想知道这些工具是如何实现的.他们只记录http请求并重播吗?它是测试AJAX应用程序的正确方法吗?

  2. jquery – 我们如何对DOM操作执行单元测试?

    但是,就像我说的…没有解决.可分解?解决方法最新版本的QUnit支持#qunit-fixture元素,可以将HTML添加到QUnit网页.例如,在你的HTML中:并在您的JavaScript中:

  3. jquery – 如何将ASP.NET MVC 3页面的HTML获取到QUnit测试中?

    到目前为止,我提供了一个HTML-mock,这个被测试的javascript文件使用。解决方法从我可以看到,您正在尝试从服务器预呈现HTML,并运行您的单元测试。最好的办法是创建一个标准的HTML页面,将其保存在您的脚本文件夹中,并将其用作“测试”页面。你不应该依赖任何标准的HTML来运行你的单元测试,因为dom可以随时改变,而是在你的单元测试中处理所有的dom操作,然后运行你的断言,然后如果它最大程度地提高效率,那么删除它。

  4. 无头JavaScript测试HTML5音频/视频

    我知道还有很多其他类似的问题,但答案并没有解决这个问题.我在我的网站上使用了一个JavaScript文件,该文件使用HTML5WebAudio并希望对其进行单元测试.我已经看过将Qunit与PhantomJS一起使用,在你说出任何我知道Phantom不支持它的情况之前(http://phantomjs.org/supported-web-standards.html)但是我想知道是否有办法解决这个

  5. javascript – QUnit,Sinon.js – 如何确保Post-Fake Server具有正确的请求体?

    我有一个JavaScript函数,它发布到远程API,我正在编写单元测试.我想测试的方法是这样的:我有一个单元测试(在QUnit中利用Sinon.js)测试在请求成功时正确调用回调:此测试有效,但无论请求主体是什么,它都会成功返回.我想做的只是假冒服务器响应,如果请求正文是{one:’one’,2:’two’}解决方法我打算建议你使用filteredrequests.但是目前的sinon实现是不可

  6. javascript – 在QUnit设置中定义测试变量

    我意识到QUnit.module提供了围绕每个测试的设置和拆除回调.如在setup中所见,我想声明一个变量以在以下QUnit.tests中使用.但是,由于变量只有函数作用域,因此两个测试失败,称usedAcrosstests未定义.我可以删除var声明,但那样会污染全局范围.特别是如果我有多个模块,我宁愿不将特定于测试的变量声明为全局变量.有没有办法在设置一个变量以在模块内的测试中使用而不污染全局范围?

  7. javascript – Qunit测试在页面刷新之间交替通过和失败

    甚至在URL中添加GET参数会导致页面上的相同行为.在失败的情况下,测试失败,因为内部jQuery在设置了submit()处理程序时正在调用.on().但是为什么在这种情况下测试总是不会失败?在页面刷新期间保持状态的浏览器是什么?

  8. javascript – 为什么会使用expect()在使用QUnit编写测试时?

    那么,我认为期望的方式是使用分组有意义的任务.它可用于测试事件或回调,例如:如果您将有意义的任务分组在小型测试中,那么只有2或3个断言才会成为一个噩梦.

  9. jquery – 在qUnit中测试整页重定向

    我有以下功能我想用qUnit测试这个函数.问题是,当我调用运行测试的HTML文档时,只要它进入调用redirect()的测试,浏览器就会加载google.com.我想做的是以某种方式模拟window.location.href,以便它不重定向,所以我可以检查它是否设置为正确的值.以一种更可测试的方式重写它将是一个可接受的答案,并受到欢迎.由于我使用的是qUnit,因此一些jQuery魔法是合适的,

  10. javascript – 断言功能会使用Qunit引发异常

    我是Qunit和单元测试的新手.我正在试图找出什么和如何测试以下功能.它目前没有做太多,但是我想断言,如果我传递错误的错误值被抛出:如果没有满足这些条件,我该如何断言会抛出错误?

随机推荐

  1. js中‘!.’是什么意思

  2. Vue如何指定不编译的文件夹和favicon.ico

    这篇文章主要介绍了Vue如何指定不编译的文件夹和favicon.ico,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  3. 基于JavaScript编写一个图片转PDF转换器

    本文为大家介绍了一个简单的 JavaScript 项目,可以将图片转换为 PDF 文件。你可以从本地选择任何一张图片,只需点击一下即可将其转换为 PDF 文件,感兴趣的可以动手尝试一下

  4. jquery点赞功能实现代码 点个赞吧!

    点赞功能很多地方都会出现,如何实现爱心点赞功能,这篇文章主要为大家详细介绍了jquery点赞功能实现代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  5. AngularJs上传前预览图片的实例代码

    使用AngularJs进行开发,在项目中,经常会遇到上传图片后,需在一旁预览图片内容,怎么实现这样的功能呢?今天小编给大家分享AugularJs上传前预览图片的实现代码,需要的朋友参考下吧

  6. JavaScript面向对象编程入门教程

    这篇文章主要介绍了JavaScript面向对象编程的相关概念,例如类、对象、属性、方法等面向对象的术语,并以实例讲解各种术语的使用,非常好的一篇面向对象入门教程,其它语言也可以参考哦

  7. jQuery中的通配符选择器使用总结

    通配符在控制input标签时相当好用,这里简单进行了jQuery中的通配符选择器使用总结,需要的朋友可以参考下

  8. javascript 动态调整图片尺寸实现代码

    在自己的网站上更新文章时一个比较常见的问题是:文章插图太宽,使整个网页都变形了。如果对每个插图都先进行缩放再插入的话,太麻烦了。

  9. jquery ajaxfileupload异步上传插件

    这篇文章主要为大家详细介绍了jquery ajaxfileupload异步上传插件,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  10. React学习之受控组件与数据共享实例分析

    这篇文章主要介绍了React学习之受控组件与数据共享,结合实例形式分析了React受控组件与组件间数据共享相关原理与使用技巧,需要的朋友可以参考下

返回
顶部