如何在Jasmine测试中放入调试器?

时间:2018-04-22 06:28:00

标签: javascript node.js jasmine node-inspector

我通过在Exercism.io上进行练习来改进我的JavaScript;我目前正致力于http://exercism.io/exercises/javascript/leap/readme

到目前为止,我已经写了var Year = function (year) {}; Year.prototype.isLeap = function () { return (this.year % 4 === 0 && this.year % 100 !== 0) || this.year % 400 === 0 }; module.exports = Year; ,如此:

leap.spec.js

Jasmine测试var Year = require('./leap'); describe('Leap year', function () { it('is not very common', function () { var year = new Year(2015); expect(year.isLeap()).toBe(false); }); it('is introduced every 4 years to adjust about a day', function () { var year = new Year(2016); expect(year.isLeap()).toBe(true); }); it('is skipped every 100 years to remove an extra day', function () { var year = new Year(1900); expect(year.isLeap()).toBe(false); }); it('is reintroduced every 400 years to adjust another day', function () { var year = new Year(2000); expect(year.isLeap()).toBe(true); });

Kurts-MacBook-Pro:leap kurtpeek$ jasmine leap.spec.js
Started
.F.F

Failures:
1) Leap year is introduced every 4 years to adjust about a day
  Message:
    Expected false to be true.
  Stack:
    Error: Expected false to be true.
        at UserContext.<anonymous> (/Users/kurtpeek/exercism/javascript/leap/leap.spec.js:11:27)

2) Leap year is reintroduced every 400 years to adjust another day
  Message:
    Expected false to be true.
  Stack:
    Error: Expected false to be true.
        at UserContext.<anonymous> (/Users/kurtpeek/exercism/javascript/leap/leap.spec.js:21:27)

Ran 4 of 8 specs
4 specs, 2 failures
Finished in 0.009 seconds

然而,一些测试仍然失败:

return

奇怪的是,如果我将this.year复制到节点REPL并将2016替换为true,我会按预期获得Kurts-MacBook-Pro:leap kurtpeek$ node > (2016 % 4 === 0 && 2016 % 100 !== 0) || 2016 % 400 === 0 true

this.year

我怀疑发生的事情是2016不是数字year,而是之前实例化的Year的实例isLeap,因此模数表达式不会#39;没有意义。

然而,为了确认这一点,我想检查debugger;函数范围内的变量。经过一些谷歌搜索后,我尝试安装jasmine-debugjasmine-node-debug,但是当我尝试运行其中任何一个时(在return语句之前插入Kurts-MacBook-Pro:leap kurtpeek$ jasmine-node-debug internal/modules/cjs/loader.js:550 throw err; ^ Error: Cannot find module '_debugger' at Function.Module._resolveFilename (internal/modules/cjs/loader.js:548:15) at Function.Module._load (internal/modules/cjs/loader.js:475:25) at Module.require (internal/modules/cjs/loader.js:598:17) at require (internal/modules/cjs/helpers.js:11:18) at Object.<anonymous> (/usr/local/lib/node_modules/jasmine-node-debug/node_modules/node-inspector/lib/debugger.js:2:16) at Module._compile (internal/modules/cjs/loader.js:654:30) at Object.Module._extensions..js (internal/modules/cjs/loader.js:665:10) at Module.load (internal/modules/cjs/loader.js:566:32) at tryModuleLoad (internal/modules/cjs/loader.js:506:12) at Function.Module._load (internal/modules/cjs/loader.js:498:3) 语句之后)我收到以下错误:

inspect

根据我在https://github.com/angular/protractor/issues/4307阅读的内容,此错误与Node.js团队将用户迁移到新的isActive API有关 - 基本上,这些软件包已过时。

有没有其他方法可以通过Jasmine测试进入调试器?

2 个答案:

答案 0 :(得分:1)

您没有在任何地方设置 this.year

在函数 isLeap()中,this.year是 undefined 因此传递了falsy的规范。

  

您可以在规范中使用console.log()并随时查看其值。它将打印到终端以及浏览器实例。   您也可以尝试 dump()

试试这个:

var Year = function (year) {
    this.year = year;
};

您还可以使用

确认 this.year 所持有的数据类型
expect(this.year).toEqual(jasmine.any(Number));

答案 1 :(得分:1)

我设法通过使用Jasmine的CLI调用的node --inspect-brk文件运行jasmine.js来启动调试器:

Kurts-MacBook-Pro:bin kurtpeek$ node --inspect-brk /usr/local/lib/node_modules/jasmine/bin/jasmine.js ~/exercism/javascript/leap/leap.spec.js
Debugger listening on ws://127.0.0.1:9229/03d10b73-1d60-4db3-be79-850f7ee4d0d6
For help see https://nodejs.org/en/docs/inspector
Debugger attached.
Started

然后,在Chrome浏览器中导航到chrome://inspect并点击“继续”后,我就能确定this.year确实是undefined

enter image description here

然后我通过定义this.year

来修复测试
var Year = function (year) {
    this.year = year;
};

Year.prototype.isLeap = function () {
    return (this.year % 4 === 0 && this.year % 100 !== 0) || this.year % 400 === 0
};

module.exports = Year;

现在测试通过了:

Kurts-MacBook-Pro:bin kurtpeek$ jasmine ~/exercism/javascript/leap/leap.spec.js
Started
....


Ran 4 of 8 specs
4 specs, 0 failures
Finished in 0.009 seconds