Loading [MathJax]/jax/input/TeX/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将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

复制
相关文章
聊聊PegJS
在开发前端BFF框架的时候,需要将团队后台使用的JCE协议(类似ProtoBuff协议)转换成nodejs对应的语法,这里参考@tencent/jce2node-cli的实现,使用PEG.js解析生成AST,下面就来介绍一下PEG.js是如何进行解析的? 我们在对文本进行解析的时候,通常可以使用正则表达式从目标文本中提取所需信息。但是仅使用正则表达式来解析,会发现非常难以阅读,可维护性比较差,而PegJs 则是一种更加简便可维护的 parser 工具。 PEG.js是一个JavaScript的词法解析器,
QQ音乐前端团队
2021/04/19
1.5K0
利用WinSW将Frp加载为 Windows 服务
首先要下载winsw。它是一个单个的可执行文件,我们到Github release这里就可以下载winsw了。一般来说当然是下载最新的。winsw可以运行在.NET2和.NET4两个版本上,当然如果使用Win10等比较新的系统,最好下载更新版本的.NET。
Dabenshi
2023/05/26
1.5K0
用VBA将字符导出为图片
最近打算写一个简单的图片文字识别程序,想先从简单的ASCii码字符串开始。我们需要数据集,即各个字符对应的图片数据。Python的很多图像库可以办到。但是这次选择用Excel的VBA试下,因为Excel可以将单元格复制为图片。
用户6021899
2020/04/27
1.3K0
用VBA将字符导出为图片
将 php-fpm 配置为服务
请将以下脚本适当修改后命名为php-fpm #!/bin/bash # # Startup script for the PHP-FPM server. # # chkconfig: 345 85 15 # description: PHP is an HTML-embedded scripting language # processname: php-fpm # config: /usr/local/php/etc/php.ini # Source function library. . /etc/r
老高的技术博客
2022/12/28
3710
用.env文件为NodeJS加载环境变量
使用环境变量是配置 Node.js 程序的好方法。而且许多包或模块可以基于不同的 NODE_ENV 变量的值表现出不同的行为。
疯狂的技术宅
2021/04/23
9.6K0
用.env文件为NodeJS加载环境变量
Angular 路由配置(预加载配置,懒加载配置)
(1)RouterModule对象提供了两个静态的方法:forRoot()和forChild()来配置路由信息。
玖柒的小窝
2021/11/04
3.4K0
IE下用JavaScript将HTML导出为Word、Pdf
高爽
2017/12/28
2K0
IE下用JavaScript将HTML导出为Word、Pdf
Spring Boot 2.4 配置文件将加载机制大变化
Spring Boot 2.4.0.M2 刚刚发布,它对 application.properties 和 application.yml 文件的加载方式进行重构。如果应用程序仅使用单个 application.properties 或 application.yml 作为配置文件,那么可能感受不到任何区别。但是如果您的应用程序使用更复杂的配置(例如,Spring Cloud 配置中心等),则需要来了解更改的内容以及原因。
冷冷
2020/10/26
4.6K0
Spring Boot 2.4 配置文件将加载机制大变化
Spring Boot 2.4.0.M2 刚刚发布,它对 application.properties 和 application.yml 文件的加载方式进行重构。如果应用程序仅使用单个 application.properties 或 application.yml 作为配置文件,那么可能感受不到任何区别。但是如果您的应用程序使用更复杂的配置(例如,Spring Cloud 配置中心等),则需要来了解更改的内容以及原因。
冷冷
2020/10/12
1.6K0
项目需求讨论-WebView进度加载条
又到了每次的实际项目开发中的需求讨论了。这次是因为做的项目是原生内嵌WebView,所以当我们的WebView在加载网页的时候,需要有个加载进度条,当然这时候有很多种选择,但是因为普通的对话框类型的加载框太丑,我们就舍弃掉了,而是模仿微信里面的进度加载条,也就是在WebView 的顶部会有一条线来显示加载进度。(也就是下方GIF图中的那个紫红色的进度条,别问我为啥用紫红色。我就觉得用这个颜色更加明显点。O(∩_∩)O~)
青蛙要fly
2018/08/29
1.1K0
项目需求讨论-WebView进度加载条
如何用 Karma,Jasmine,Webpack 测试 UI 组件系列(一)配置篇
如何用 Karma,Jasmine,Webpack 测试 UI 组件系列 (一) 配置篇为什么要测试 从个人经验来看,测试是防止软件缺陷的最好方法。 生产开发中当我们修改一小段代码,大部分的开发人员会手动打开他们的浏览器 或 POSTMAN来验证它是否仍然正确。 这种方法(手工测试)不仅低效,而且会隐藏一些你未发现的缺陷。 我们测试我们软件的目的是验证它是否如我们预期中的一毛一样。 单元测试 单元测试是一种测试你的项目中每个最小单元代码的有效手段,是使你的程序思路清晰的基础。 一旦所有的测试通过,这些零
企鹅号小编
2018/03/05
2.2K0
如何用 Karma,Jasmine,Webpack 测试 UI 组件系列(一)配置篇
karma与webpack结合
一、必备插件 1.babel:es6的语法支持 2.karma:测试框架 3.jasmine:断言框架 4.webpack:打包工具 5.karma-webpack:karma调用webpack打包接口的插件 二、实现步骤 1.通过npm安装上述必备的插件包 2.创建webpack.test.config.js文件,此文件的配置用于单元测试 var path = require('path'); var webpack = require('webpack'); module.exports={ m
sam dragon
2018/01/17
1K0
用Go自己实现配置文件热加载功能
说到配置文件热加载,这个功能在很多框架中都提供了,如beego,实现的效果就是当你修改文件后,会把你修改后的配置重新加载到配置文件中,而不用重启程序,这个功能在日常中还是非常实用的,毕竟很多时候,线上的配置文件不是想改就能改的。 这次就自己实现一个配置文件的热加载功能的包,并通过一个简单的例子对完成的包进行使用验证 配置文件热加载包的是实现 其实整体的思路还是比较简单的,当获取配置文件内容后,会开启一个goroutine,去 循环读配置文件,当然这里不可能不限制的一直循环,而是设置了一个定时器,定时去读文件
coders
2018/03/30
1.7K0
用Go自己实现配置文件热加载功能
未来10年车用芯片需求将倍增,将更依賴于晶圆代工厂
3月27日消息,日本新闻网站Newswitch于3月25日报导称,英国调查公司IDTechEx公布预测报告指出,未来10年间(2023-2033年)车用芯片需求预估将成倍增长,且将更加依赖晶圆代工厂进行生产。
芯智讯
2023/04/11
1970
未来10年车用芯片需求将倍增,将更依賴于晶圆代工厂
基于Karma构建微服务
“微服务”和“微服务架构”在开发社者区中是一个热门话题,但实际中的微服务例子仍然很少。通过简要介绍一下我们在Karma上构建的后端API可会对现在的情况有所帮助。这不是“如何去做”的例子,而更像是“为什么要做”或“这样做的原因”的一个例子,希望这个例子能让您对微服务适用范围和使用方法有所了解。
Techeek
2018/07/09
1K0
基于Karma构建微服务
用PHP将图片以流的形式加载到image标签中
  很多情况下,如果为了网站资源案例考虑,我们就不能直接暴露资源的地址到页面中去,以防被人用工具去扫描盗用资源文件下的文件,在这里我们就可以考虑以前端页面请求后端程序,后端程序加以验证之后,以流的方式将资源输出,这样就会安全多了。
Sindsun
2019/12/06
1.8K0
搭建 karma + jasmine 测试环境
在前端开发的过程中,我们会写很多的功能函数,这样就会涉及到对这些功能函数进行单元测试,而karma就是一个很好用的可以在浏览器环境中进行测试的集成工具。
leocoder
2018/10/31
1.8K0
airbase-ng实现Karma攻击
我写这篇文章,只是想介绍一下使用airbase-ng进行karma攻击的方法。这也是以前写的文章然后存本地了,单纯介绍操作而已,没有介绍什么原理方法,也没什么技术含量。只是这方面文章较少,发出来和各位大佬交流学习。 关于更多的Karma相关原理或者通过WiFi Pineapple进行攻击实现,可以参考Freebuf一篇非常好的文章:
Y1ng
2022/10/31
5360
airbase-ng实现Karma攻击
webpack4.0各个击破(9)—— karma篇
webpack对应的关键词是模块化,它的主要任务就是打包和管理模块,所以首先需要明确的概念就是webpack之所以关联自动化测试,是因为它能够为测试脚本提供模块管理的能力,本质上来讲,是将webpack的打包功能嵌入了自动化测试框架,而不是将自动化测试框架作为插件集成进了webpack,理解这个区别是非常关键的。
大史不说话
2018/09/10
1.2K0
webpack4.0各个击破(9)—— karma篇
点击加载更多

相似问题

将jasmine配置为使用Karma

10

如何配置Karma以使用需求和qunit

23

Karma配置未能正确加载

12

用需求加载工艺

13

用Karma加载HTML文件

13
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

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

洞察 腾讯核心技术

剖析业界实践案例

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