在 CoffeeScript 文件上运行 Jasmine 测试时对象未定义错误

Posted

技术标签:

【中文标题】在 CoffeeScript 文件上运行 Jasmine 测试时对象未定义错误【英文标题】:object is not defined error when running Jasmine tests on CoffeeScript files 【发布时间】:2012-08-15 10:12:43 【问题描述】:

我一直在学习coffeescript,作为学习的练习,我决定TDD Conway's Game of Life。我选择的第一个测试是创建一个 Cell 并查看它是死的还是活的。为此,我创建了以下咖啡脚本:

class Cell 
  @isAlive = false


  constructor: (isAlive) ->
    @isAlive = isAlive

  die: ->
    @isAlive = false

然后我使用以下代码创建一个 Jasmine 测试文件(这是故意失败的测试):

Cell = require '../conway'

describe 'conway', ->
  alive = Cell.isAlive
  cell = null

  beforeEach ->
    cell = new Cell()

 describe '#die', ->
   it 'kills cell', ->
     expect(cell.isAlive).toBeTruthy()

但是,当我在 Jasmine 中运行测试时,出现以下错误:

cell is not defined

还有堆栈跟踪:

1) kills cell
   Message:
     ReferenceError: cell is not defined
   Stacktrace:
     ReferenceError: cell is not defined
    at null.<anonymous> (/Users/gjstocker/cscript/spec/Conway.spec.coffee:17:21)
    at jasmine.Block.execute (/usr/local/lib/node_modules/jasmine-node/lib/jasmine-node/jasmine-2.0.0.rc1.js:1001:15)

当我执行 coffee -c ./spec/Conway.spec.coffee 并查看生成的 javascript 文件时,我看到以下内容(第 17 行,第 21 列是错误):

// Generated by CoffeeScript 1.3.3
(function() 
  var Cell;

  Cell = require('../conway');

  describe('conway', function() 
    var alive, cell;
    alive = Cell.isAlive;
    cell = null;
    return beforeEach(function() 
      return cell = new Cell();
    );
  );

  describe('#die', function() 
    return it('kills cell', function() 
      return expect(cell.isAlive).toBeTruthy(); //Error
    );
  );

).call(this);

我的问题是,据我所知,cell 定义。我知道我错了(因为SELECT is not broken),但我想弄清楚我在哪里搞砸了。我如何用咖啡脚本诊断这个错误并找出我哪里出错了?

我研究了很多coffeescript应用程序中包含的源代码,包括this one,但是源代码的格式完全一样,声明也一样。

【问题讨论】:

【参考方案1】:

这是一个缩进问题,here's your fix:

Cell = require '../conway'

describe 'conway', ->
  alive = Cell.isAlive
  cell = null

  beforeEach ->
    cell = new Cell()

  describe '#die', ->
    it 'kills cell', ->
      expect(cell.isAlive).toBeTruthy()

如果您查看编译后的 JavaScript,您有一个 describe 块,其中有一个 beforeEach。但是您的下一个describe 块(您希望在第一个块内)实际上不是在它里面——它在外面。

这是因为第二个describe 的缩进只有一个空格,而不是两个。

【讨论】:

感谢您的关注。我仍然在测试夹具中看到错误,但这确实发现了一个问题。

以上是关于在 CoffeeScript 文件上运行 Jasmine 测试时对象未定义错误的主要内容,如果未能解决你的问题,请参考以下文章

仅针对节点版本8或更高版本运行coffeescript测试

Coffeescript 等到从回调中设置标志,然后继续代码的下一部分

不能在Cygwin运行的CoffeeScript

ruby on rails 中的 Coffeescript 编译错误

如何不封装 Coffeescript

如何将胖箭头AngularJS转换为coffeescript