Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >将Karma配置为用需求加载pegjs

将Karma配置为用需求加载pegjs
EN

Stack Overflow用户
提问于 2015-11-24 05:46:29
回答 3查看 864关注 0票数 12

尝试使用PegJS和requirejs测试一个项目。我有两个源文件,实现为AMD模块(定义),通过需求API加载。在目录结构下面:

代码语言:javascript
运行
AI代码解释
复制
js/
   somefile.js
   main.js
   parser.js
test/
   parser.spec.js

我编写了一个parser.js模块来加载PegJS语法文件,并使用PegJS创建一个peg解析器:

代码语言:javascript
运行
AI代码解释
复制
define(function() {
  'use strict';

  var PEG = require('pegjs');
  var grammarFile = 'grammar.peg'

return {
  parse: function(fs, content, debug) {
    var grammar = fs.readFileSync(grammarFile, 'utf8').toString();
    // Build parser from grammar
    var parser = PEG.buildParser(grammar, { trace: debug });
    [...]

对于在带有节点的命令行上执行的main.js来说,这很好。现在我想用业力,茉莉花和PhantomJS来测试我的项目。我有一个这样的karma.conf.js

代码语言:javascript
运行
AI代码解释
复制
frameworks: ['jasmine', 'requirejs'],
files: [
  { pattern: './test/**/*.spec.js', included: false },
  { pattern: './js/**/*.js', included: false},
  './test/test-main.js',
],

还有一个名为test-main.js的需要引导文件,其配置方式如下:

代码语言:javascript
运行
AI代码解释
复制
'use strict';

var allTestFiles = [];
var TEST_REGEXP = /(spec|test)\.js$/i;

// Get a list of all the test files to include
Object.keys(window.__karma__.files).forEach(function(file) {
  console.log(file);
  if (TEST_REGEXP.test(file)) {
    // Normalize paths to RequireJS module names.
    // If you require sub-dependencies of test files to be loaded as-is (requiring file extension)
    // then do not normalize the paths
    var normalizedTestModule = file.replace(/^\/base\/|\.js$/g, '');
    allTestFiles.push(file);
  }
});

require.config({
  // Karma serves files under /base, which is the basePath from your config file
  baseUrl: '/base/js',
  // dynamically load all test files
  deps: allTestFiles,
  // we have to kickoff jasmine, as it is asynchronous
  callback: window.__karma__.start
});

现在,当我启动我的测试(grunt karma)时,我得到了以下错误:

代码语言:javascript
运行
AI代码解释
复制
PhantomJS 1.9.8 (Linux 0.0.0) ERROR: Error{message: 'Module name "pegjs" has not been loaded yet for context: _. Use require([])

因此,我尝试在Karma以karma.conf.js方式加载的文件中包含pegjs。

代码语言:javascript
运行
AI代码解释
复制
files: [
  { pattern: 'node_modules/pegjs/lib/**/*.js', included: true  },
  { pattern: './test/**/*.spec.js', included: false },
  { pattern: './js/**/*.js', included: false},
  './test/test-main.js'
],

当我这样做的时候,我仍然会发现一个错误:

代码语言:javascript
运行
AI代码解释
复制
Error: Module name "utils/arrays" has not been loaded yet for context: _. Use require([])

从pegjs模块内部看,确实有一个arrays.js文件:

代码语言:javascript
运行
AI代码解释
复制
compiler/
compiler.js
grammar-error.js
parser.js
peg.js
utils/
  arrays.js
  classes.js
  objects.js

因此,也试图包括数组:

代码语言:javascript
运行
AI代码解释
复制
files: [
  { pattern: 'node_modules/pegjs/lib/utils/arrays.js', included: true },
  { pattern: 'node_modules/pegjs/lib/**/*.js', included: true  },
  { pattern: './test/**/*.spec.js', included: false },
  { pattern: './js/**/*.js', included: false},
  './test/test-main.js'
],

我得到:

代码语言:javascript
运行
AI代码解释
复制
ReferenceError: Can't find variable: module
at /blabla/node_modules/pegjs/lib/utils/arrays.js:108

因为:

代码语言:javascript
运行
AI代码解释
复制
108 module.exports = arrays;

因此,在加载npm模块时,我尝试以这样的方式加载bower模块:

代码语言:javascript
运行
AI代码解释
复制
files: [
  { pattern: 'bower_components/pegjs/peg-0.9.0.js', included: true },
  { pattern: './test/**/*.spec.js', included: false },
  { pattern: './js/**/*.js', included: false},
  './test/test-main.js'
],

你又来了:

代码语言:javascript
运行
AI代码解释
复制
PhantomJS 1.9.8 (Linux 0.0.0) ERROR: Error{message: 'Module name "pegjs" has not been loaded yet for context: _. Use require([])

还试图在业力生成的网页中不包含pegjs:

代码语言:javascript
运行
AI代码解释
复制
files: [
  { pattern: 'bower_components/pegjs/peg-0.9.0.js', included: false },
  { pattern: './test/**/*.spec.js', included: false },
  { pattern: './js/**/*.js', included: false},
  './test/test-main.js'
],

但它失败了,因为:

代码语言:javascript
运行
AI代码解释
复制
PhantomJS 1.9.8 (Linux 0.0.0) ERROR: 'There is no timestamp for /base/bower_components/pegjs/peg-0.9.0!'

试图将bower_component文件夹放入js文件夹中,但没有找到任何结果。

所以我不知道从这里开始.在谷歌或这里找不到任何相关的东西。这似乎是一个特殊的问题,要求与业力.任何想法都是欢迎的。

丹回答后的更新:

因此,在parser.js中,我从同步需求切换到异步需求。

代码语言:javascript
运行
AI代码解释
复制
define(['../bower_components/pegjs/peg-0.9.0'], function(PEG) {
  'use strict';

  var grammarFile = 'grammar.peg'

return {
  parse: function(fs, content, debug) {
    var grammar = fs.readFileSync(grammarFile, 'utf8').toString();
    // Build parser from grammar
    var parser = PEG.buildParser(grammar, { trace: debug });
    [...]

尝试在karma.conf.js中包含pegjs bower组件

代码语言:javascript
运行
AI代码解释
复制
{ pattern: 'bower_components/pegjs/peg-0.9.0.js', included: false },

或不包括在内:

代码语言:javascript
运行
AI代码解释
复制
{ pattern: 'bower_components/pegjs/peg-0.9.0.js', included: true },

但总是有相同的错误:

代码语言:javascript
运行
AI代码解释
复制
Error: Script error for "/blabla/bower_components/pegjs/peg-0.9.0", needed by: /blabla/js/parser.js
http://requirejs.org/docs/errors.html#scripterror
at /blabla/node_modules/requirejs/require.js:140

是的,该文件存在:

代码语言:javascript
运行
AI代码解释
复制
$ file /home/aa024149/share/logofrjs/bower_components/pegjs/peg-0.9.0.js 
/blabla/bower_components/pegjs/peg-0.9.0.js: ASCII text, with very long lines

UPDATE2:最终理解并找到了一个可接受的解决方案。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-12-01 23:32:20

因此,在丹和pieceOpiland的各种回答和评论的帮助下,我终于找到了一种我想做的事情。

因此,首先,与许多javascript库一样,pegjs有两种格式: npm模块和bower模块。

Npm模块用于为节点制作脚本并从命令行调用。Bower模块用于在浏览器中加载脚本。

我的第一个误解是,“require”在节点和浏览器中都会不清楚地工作。这是错误的。似乎只有通过异步调用才能使模块在浏览器中工作,如下所示:

代码语言:javascript
运行
AI代码解释
复制
require(['module'], function(module) {
  ...
});

另一个误解是,我可以在浏览器中加载npm模块。某种魔法将操作各种npm文件,以加载我的页面。这可能是可能的,但只能使用一些特殊的工具,比如、browserify。在没有特殊转换的情况下,只能在浏览器中加载bower版本。此外,pegjs bower模块是以这样的方式生成的,因此全局变量的定义如下:

代码语言:javascript
运行
AI代码解释
复制
var PEG = {
 ...
}

module.exports = PEG;

基本上,bower模块将全局变量(实际上是几个全局变量)插入到顶层范围。

因此,与其让我的客户端代码(在浏览器和节点中运行的代码)加载模块,我实际上将模块加载在以下两种方式中:

  1. main.js通过对npm模块的同步要求,如:var PEG = require('pegjs');
  2. tag通过全局变量(在加载bower脚本时(通过<script>标记)可用)。

然后这两个‘main’都将PEG变量注入到我的解析器函数中。

为了使业力发挥作用,我只需要在生成的页面(karma.conf.js提取中包含pegjs bower模块):

代码语言:javascript
运行
AI代码解释
复制
files: [
 { pattern: 'bower_components/pegjs/peg-0.9.0.js', included: true },
 { pattern: './test/**/*.spec.js', included: false },
 { pattern: './js/**/*.js', included: false},
 './test/test-main.js',
],
票数 0
EN

Stack Overflow用户

发布于 2015-11-29 14:00:31

听起来好像你是通过需求来加载连接的。如果是这样的话,pegjs不应该是包含在其中的文件。在您的karma.conf.js中,您是否尝试过以下方法:

代码语言:javascript
运行
AI代码解释
复制
files: [
  { pattern: 'bower_components/pegjs/peg-0.9.0.js', included: false },
  { pattern: './test/**/*.spec.js', included: false },
  { pattern: './js/**/*.js', included: false},
  './test/test-main.js'
],

包含的值指示业力服务器生成的网页是否应该有该文件的脚本标记(参见http://karma-runner.github.io/0.13/config/files.html)。所以你的karma.config:

代码语言:javascript
运行
AI代码解释
复制
files: [
  { pattern: 'bower_components/pegjs/peg-0.9.0.js', included: true },
  { pattern: './test/**/*.spec.js', included: false },
  { pattern: './js/**/*.js', included: false},
  './test/test-main.js'
],

将导致业力生成一个带有头部标记的网页,类似于:

代码语言:javascript
运行
AI代码解释
复制
<head>
  <script src="/base/bower_components/pegjs/peg-0.9.0.js"></script>
  <script src="/base/require.js"></script>
  <script src="/base/test/test-main.js"></script>
</head>

在我的经验中,我看到了许多类似于将我的文件标记为included: true导致的行为。如果有一个文件正在尝试加载,请确保它被标记为included: false

我相信这标志着它是一个预处理工作,但我不完全确定为什么这会产生如此大的差异。

票数 3
EN

Stack Overflow用户

发布于 2015-12-01 02:17:12

据我所知,Karma是一个测试框架,它将在浏览器中运行您的测试。

这不适合于测试许多节点模块。

浏览器没有同步完成此操作的工具:var PEG = require('pegjs')。这就是为什么它要求您使用require([]),在pegjs完成加载时传递一个回调以执行该回调。

在这里,使用第一个版本的pegjs并确保在调用require('pegjs')之前加载它可能会有所帮助。这将确保已经为context _(我猜想是默认的需求上下文)加载了pegjs。

它也不能用fs.readFileSync(grammarFile, 'utf8')从文件系统加载文件,所以您必须用另一种方式来加载文件。您可以通过将它放置在文件数组中,然后使用所需文本插件加载它,从而让Karma托管您的peg语法。

如果您正在测试的模块的目标是在node.js上运行,而不是在浏览器中运行,那么它可能更适合使用一个测试框架,该框架不运行浏览器中的代码,而是在节点中运行它,因此您可以使用所有的节点模块。如果您针对的是浏览器,我会重写它,以便更具体地针对浏览器。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33895334

复制
相关文章
查找匹配函数组合Index+Match
Index+Match 我是什么时候学习这个函数的呢 "在我发现记Vlookup反向查找过于困难的时候" 所以 一开始我是当做方向查找的替代公式来用的 直接上公式 =INDEX(D2:E6,MATCH(G2,E2:E6,0),1) 这一组函数的意思是 在D2:E6的范围内返回x行1列的值 x行由Match函数确定后返回 D2:E6也就是上图蓝框范围 " 插一句 Excel的坐标系是左上为1 也就是 这样的 与我们熟悉的笛卡尔坐标系的Y轴是相反的 并且没有负数 (关联文章:R1C1引用样式是神
但老师
2022/03/22
5770
查找匹配函数组合Index+Match
「JavaScript」数组与函数
请注意,本文编写于 2099 天前,最后修改于 174 天前,其中某些信息可能已经过时。
曼亚灿
2023/05/17
5640
「JavaScript」数组与函数
二维数组与语法糖
距离上一篇稿子大约又有一周多的时间了。在这一周多的时间里,我还是蛮感动的,因为有好多人还一直惦记着这个专栏~有一位头像贼眼熟的小姐姐还特意在我的CSDN博客下留言;前几天厂长还在粉丝群里@我,在催更的同时还问我可不可以再开一个C++专栏,我看到的时候已经很晚了,所以就没有在群里回复~
谭庆波
2019/01/02
1.1K0
Java基础——函数与数组
A:函数与函数之间是平级关系。不能在函数中定义函数。因为函数体是完成功能的代码是由语句组成的,所以里面可以由顺序执行语句、选择语句、循环语句等各种语句。
阿Q说代码
2021/05/13
3980
Java基础——函数与数组
Rust 基础语法(二) -- 函数与循环
Rust 中可以在一个用 {} 包括的块里编写一个较为复杂的表达式,从而构成一个函数体:
用户3147702
2022/06/27
3420
Rust 基础语法(二) -- 函数与循环
DorisSQL与MySQL函数与语法对照差异篇
doris执行异常:[Err] 1064 - errCode = 2, detailMessage = cannot combine SELECT DISTINCT with aggregate functions or GROUP BY
小晨说数据
2022/11/18
5.5K0
yara匹配引擎进阶语法指南
具备检测相关经验的同学可能都对yara匹配引擎比较熟悉了,看雪论坛上也有非常详细的翻译文章 - 编写Yara规则检测恶意软件 本文主要对yara文档容易被忽略的部分进行了翻译和总结,并且给出一些进阶用法的例子,提高对yara匹配引擎语法的理解程度。
用户1879329
2023/02/27
1.6K0
yara匹配引擎进阶语法指南
Java基础语法(六)——数组的定义与使用
  在上面的实例中,我们就以整型数组为例,创建了一个 int [ ] 类型的array数组,并且存放了5个整形数据.讲解了数组创建时的用法,Java数组的创建与C语言很是相似,但是还是有区别的.
RAIN7
2021/08/11
25.1K0
【Python】函数进阶 ④ ( Lambda 匿名函数 | 具名函数与匿名函数 | Lambda 函数定义语法 )
在 Python 中 , 使用 def 关键字定义的函数 是 " 具名函数 " , 也就是有名字的函数 ;
韩曙亮
2023/10/11
3710
【Python】函数进阶 ④ ( Lambda 匿名函数 | 具名函数与匿名函数 | Lambda 函数定义语法 )
Java 语法(五):数组
当然,一般情况下我们更喜欢使用第一种方式来声明一个数组,因为它将类型与变量名分开,优化了代码的可读性。刚刚我们只是声明了一个数组 a ,但是并没有将 a 初始化为一个真正的数组。
山禾说
2020/03/19
4340
PHP数组函数下与二维多维数组与数组的遍历(终点篇)
把数组分割为带有两个元素的数组块:意思是我看一下,记住了呀,兄弟们,这像是二维数组一样的吧,分成两个元素两个元素的,第一个两个元素的前面是(下标0),然后是第二个两个元素的是(下标1)哈
贵哥的编程之路
2020/10/28
1.7K0
PHP数组函数下与二维多维数组与数组的遍历(终点篇)
javascript数组常用函数与实战总结
在node.js后端开发过程中,数组这种数据类型(Object类型)再常见不过,本文主要介绍数组的一些常见函数,以及在实战开发过程中能更好的操作数组的lodash包。
coder_koala
2019/07/30
1.1K0
Java基本语法——数组结构(多维数组)
本讲继续讲解了Java的基础语法,数据结构数组,数组也是Java很多数据结构的一个重要部分之一,一般开发中其实很少使用数组,反而用相关集合类,比如List和ArrayList,这些性能以及对应的api调用比数组丰富,我们后续慢慢也会讲解和使用这些集合类。
小明爱吃火锅
2023/09/29
2820
git .gitignore 忽略规则的匹配语法
2)以“#”开头的行都会被 Git 忽略。即#开头的文件标识注释,可以使用反斜杠进行转义;
小蔚
2020/09/07
8.1K0
c++之函数重载(函数匹配)
Case void f(); void f(int); void f(int, int); void f(double, double = 3.14); 匹配原则: 1)其形参数量与本次调用提供的实参数量相等 2)每个实参的类型与对应的形参类型相同,或者可以转换成形参的类型; 寻找最佳匹配: 1)该函数每个实参的匹配都不劣于其他可行函数需要的匹配; 2)至少有一个实参的匹配优于其他可行函数提供的匹配; 例子: a) f(2.56,38); b) f(38); c) f(32,0); d) f(3.9,9.8
互联网金融打杂
2018/04/03
8590
PHP数组下(数组指针,与数组函数一部分)
数组指针: 一步步来哈 意思是定义一个关联数组,然后是取出第一个 a r r [ 0 ] 的 键 值 ‘ arr[0]的键值` arr[0]的键值‘val=current( a r r ) ; ‘ , 然 后 取 出 第 一 个 arr);`,然后取出第一个 arr);‘,然后取出第一个arr[0]的键名key=key(arr);,然后输出把echo key."-".
贵哥的编程之路
2020/10/28
8520
PHP数组下(数组指针,与数组函数一部分)
彻底理清重载函数匹配
前面我们讲到了《什么是函数重载?》,有了函数重载之后,就需要确定某次调用需要选用哪个函数。这个过程可以称之为函数匹配或者重载确定。大多数情况下,我们都很容易能够确定某次调用需要选用哪个函数,但事实上不尽然。但通过本文将彻底理清重载函数匹配
编程珠玑
2019/09/02
6840
指针与数组和函数的几个关系
指针数组、数组指针 指针数组。数组的元素类型是指针 如:int* a[4] 数组指针。指向数组的指针变量 如:int (*a)[4]; int main() { int a[4] = {1, 2, 3, 4}; //指针数组 int *b[4]; //数组指针 int (*c)[4]; c = &a; for (int i = 0; i < 4; i++) { b[i] = &a[i]; } printf
用户2929716
2018/08/23
4660
Python基础语法-函数-定义函数
Python中的函数是一段代码块,可以被多次调用执行。函数通常被用来完成一些特定的任务,它们接受参数(如果有的话),并且可以返回一个值(如果有的话)。
玖叁叁
2023/04/17
5110
Excel公式技巧76:解决IF函数与数组函数的冲突
在Excel中,有一些函数可以接受数组参数进行数组运算,例如SUMPRODUCT函数,它们不需要像数组公式那样,在输入结束前要按Ctrl+Shift+回车键。然而,IF函数打破了这个规则。如果这些函数的参数是由IF函数提供,那么还是需要按Ctrl+Shift+回车键。
fanjy
2021/01/06
2.9K0

相似问题

PHP函数与数组语法问题

10

语法混乱:函数调用与数组索引

12

C函数参数中的数组语法与指针语法

22

VBA与数组的匹配函数

13

F#显式匹配与函数语法

82
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档