将Jasmine测试结果输出到控制台

41


我在我的火狐插件中使用Jasmine(JavaScript BDD测试框架)来测试代码的功能。

问题是Jasmine将测试结果输出到HTML文件中,我需要使用Firebug控制台或其他解决方案将结果输出。

5个回答

29

你尝试过使用ConsoleReporter吗?

jasmine.getEnv().addReporter(new jasmine.ConsoleReporter(console.log));

根据代码,Jasmine有ConsoleReporter类执行print函数(在这种情况下是console.log),可以做你需要的事情。

如果一切都失败了,您可以将其用作实现自己的console.log报告的起点。

更新 在较新的jasmine版本中,已删除ConsoleReporter。您可以使用内置的jsApiReporter,或编写自己的(console)报告器,如以下链接所示:https://jasmine.github.io/tutorials/custom_reporter


你有在 iPhone 上实现 Jasmine 吗?如果是的话,ConsoleReporter 是否可以在 iPhone 的控制台中输出结果? - DShah
2
它可以工作,但要注意使用哪个版本的Jasmine。提供的ConsoleReporter GitHub链接指向ConsoleReporter.js的主分支版本,该版本使用与当前(1.3.1)官方版本的Jasmine不同的reporter-API(例如jasmineStarted或jasmineDone而不是reportRunnerStarting等)。如果对您无效,则可能需要选择v1.3.1标签(或使用此链接https://github.com/pivotal/jasmine/blob/v1.3.1/src/console/ConsoleReporter.js)。 - Mateusz Szulc

15
在最新的 Jasmine (2.0) 版本 中,如果您想要将测试输出到控制台,则需要添加以下代码行。
var ConsoleReporter = jasmineRequire.ConsoleReporter();
var options = {
   timer: new jasmine.Timer, 
   print: function () {
      console.log.apply(console,arguments)
}};
consoleReporter = new ConsoleReporter(options); // initialize ConsoleReporter
jasmine.getEnv().addReporter(consoleReporter); //add reporter to execution environment

默认情况下,输出到html已经包含了,如果你不想要任何html输出,你需要编辑boot.js文件并从中删除相关行。如果你想自定义控制台中的输出显示方式,编辑console.js文件即可。 来源

通过Guard(使用PhantomJS)运行Jasmine,我尝试将上述内容添加到我的测试的“describe”块中,但出现“找不到变量:jasmineRequire”的错误。 - Dave Sag
@DaveSag 将其添加到 boot.js 中。 - mustafa.0x

6
为了完整起见,这是完整的配置:
首先运行“npm install”命令:
npm install jasmine-console-reporter --save-dev

然后检查您的Jasmine配置,确保您在那里设置了helpers:
spec/support/jasmine.json
{
    "spec_dir": "spec",
    "spec_files": [
        "**/*[sS]pec.js"
    ],
    "helpers": [
        "helpers/**/*.js"
    ],
    "stopSpecOnExpectationFailure": false,
    "random": false
}

由于助手在规范之前执行,所以您需要做的唯一一件事就是创建一个控制台报告者助手。

spec/helpers/reporter/consoleReporter.js

const JasmineConsoleReporter = require('jasmine-console-reporter');

let consoleReporter = new JasmineConsoleReporter({
    colors: 1,           // (0|false)|(1|true)|2
    cleanStack: 1,       // (0|false)|(1|true)|2|3
    verbosity: 4,        // (0|false)|1|2|(3|true)|4
    listStyle: 'indent', // "flat"|"indent"
    activity: false
});

jasmine.getEnv().addReporter(consoleReporter);

1
这太荒谬了,使用jasmine是多么的复杂。为什么不在jasmine.json中添加"color": "true"选项呢?就像在mocha中只需在配置文件中键入--color一样。 - Green

6

jasmineRequire.ConsoleReporter在2.3.0中不存在,所以我使用了以下代码:

//create a console.log reporter
var MyReporter = function(){jasmineRequire.JsApiReporter.apply(this,arguments);};
MyReporter.prototype = jasmineRequire.JsApiReporter.prototype;
MyReporter.prototype.constructor = MyReporter;
MyReporter.prototype.specDone=function(o){
    o=o||{};
    if(o.status!=="passed"){
      console.warn("Failed:" + o.fullName + o.failedExpectations[0].message);
    }
};
var env = jasmine.getEnv();
env.addReporter(new MyReporter());

在Jasmine 2.8.0下对我有效 :) 我在创建jsApiReporter后立即将其添加到boot.js中。我删除了var env=...行,因为env已经存在。您是否愿意添加一些说明以帮助我更好地理解JsApiReporterMyReporter之间的交互? - cxw

0

我创建了上述答案的摘要解决方案,并在不同的jasmine版本上进行了测试。将其添加到您的boot.js中(例如,添加到boot1.js中):

      const env = jasmine.getEnv();
      const jasmineRequire = window.jasmineRequire || require('./jasmine.js');
    
      var ConsoleReporter = window.ConsoleReporter;
      var options = null;
      if (!jasmine.ConsoleReporter || !!jasmineRequire.ConsoleReporter) {  
          if (!jasmineRequire.ConsoleReporter) {
                ConsoleReporter = function(){jasmineRequire.JsApiReporter.apply(this,arguments);};
                ConsoleReporter.prototype = jasmineRequire.JsApiReporter.prototype;
                ConsoleReporter.prototype.constructor = ConsoleReporter;
                ConsoleReporter.prototype.specDone = function (o) {
                    o = o || {};
                    if (o.status !== "passed") {
                      console.warn("Failed: " + o.fullName + o.failedExpectations[0].message);
                    } else {
                      console.debug("Passed: " + o.fullName);
                    }
                };
          } else {  
              ConsoleReporter = jasmineRequire.ConsoleReporter();
              options = {
                  timer: new jasmine.Timer, 
                  print: function () {
                      console.log.apply(console,arguments)
                  }
              };
          }
      } else {
          ConsoleReporter = jasmine.ConsoleReporter;
          options = console.log;
      }
      window.ConsoleReporter = ConsoleReporter;
      
      consoleReporter = new ConsoleReporter(options); // initialize ConsoleReporter
      env.addReporter(consoleReporter); // add reporter to execution environment


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接