当使用Mocha和chai时,何时用函数包装期望?

时间:2014-01-02 23:30:18

标签: javascript coffeescript mocha chai

对于抛出异常的代码,我需要将期望包装在匿名函数中。否则,在Mocha捕获之前抛出异常。 请参阅此StackOverflow answer

但包装似乎有副作用 包装时,以下代码的行为有所不同。这似乎是一个柴问题。

chai = require 'chai'
expect = chai.expect

describe 'Weird', ->

  obj =
    name: 'kalle'

  it 'not wrapped', () ->
    expect(obj).to.have.property 'name', 'kalle'

  it 'wrapped', () ->
    expect(->obj).to.have.property 'name', 'kalle'

我手工制作的Javascript版本:

var expect = require('chai').expect;

describe('Weird', function() {
    obj = {name: 'kalle'};

    it('not wrapped', function() {
      expect(obj).to.have.property('name', 'kalle');
    });

    it('wrapped', function() {
        expect(function() {return obj}).to.have.property('name', 'kalle');
    });
});

失败如下:
AssertionError: expected [Function] to have a property 'name' of 'kalle', but got ''

Weird
    ✓ not wrapped 
    1) wrapped


  1 passing (10ms)
  1 failing

  1) Weird wrapped:

      + expected - actual

      +kalle

为什么包装会产生不同的结果?
提前谢谢!

1 个答案:

答案 0 :(得分:0)

在这两种情况下,您都将函数作为参数传递,而不是函数的结果。我希望当你在链接的SO回答中调用to.throw时,mocha实际上会调用该函数。为了在这种情况下解决这个问题,你需要实际调用你期望的函数:

expect(->obj()).to.have.property 'name', 'kalle'