50

I am configuring my Karma amd mocha framework with grunt in my project. When I am running karma start I am getting below-mentioned error.

I am getting this error in my console while running command : Karma start

TypeError: expect(...).to.be is not a function

My Karma.confjs

// Karma configuration
// Generated on Fri Nov 27 2015 11:48:47 GMT+0530 (India Standard Time)

module.exports = function(config) {
  config.set({

    // base path that will be used to resolve all patterns (eg. files, exclude)
    basePath: '',


    // frameworks to use
    // available frameworks: https://npmjs.org/browse/keyword/karma-adapter
    frameworks: ['mocha', 'chai'],


    // list of files / patterns to load in the browser
    files: [
      'bower_components/angular/angular.js',
      'bower_components/angular-mocks/angular-mocks.js',
      'app/*.js',
      // 'test/specs/*.js',
      'test/specs/array.js',
      // 'test/specs/myCtlr-spec.js',
      //'test/*.js'
    ],


    // list of files to exclude
    exclude: [
    ],


    // preprocess matching files before serving them to the browser
    // available preprocessors: https://npmjs.org/browse/keyword/karma-preprocessor
    preprocessors: {
    },


    // test results reporter to use
    // possible values: 'dots', 'progress'
    // available reporters: https://npmjs.org/browse/keyword/karma-reporter
    reporters: ['progress','coverage'],

    preprocessors: {
        'src/app/**/*.js': ['coverage']
    },
    coverageReporter: {
        type: 'lcov',
        dir: 'coverage/'
    },

    // web server port
    port: 9876,


    // enable / disable colors in the output (reporters and logs)
    colors: true,


    // level of logging
    // possible values: config.LOG_DISABLE || config.LOG_ERROR || config.LOG_WARN || config.LOG_INFO || config.LOG_DEBUG
    logLevel: config.LOG_INFO,


    // enable / disable watching file and executing tests whenever any file changes
    autoWatch: true,


    // start these browsers
    // available browser launchers: https://npmjs.org/browse/keyword/karma-launcher
    // browsers: ['PhantomJS', 'Chrome'],
    browsers: ['Chrome'],


    // Continuous Integration mode
    // if true, Karma captures browsers, runs the tests and exits
    singleRun: false,

    // Concurrency level
    // how many browser should be started simultanous
    concurrency: Infinity
  })
}

My array.js test

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

describe("Mocha: The 'toBe' matcher compares with ===", function() {
  it("and has a positive case", function() {
    expect(true).to.be(true);
  });

  it("and can have a negative case", function() {
    expect(false).not.to.be(true);
  });
});

enter image description here

Please suggest what I am missing.

Javascript Coder
  • 5,691
  • 8
  • 52
  • 98

2 Answers2

65

You need to write expect(true).to.be.equal(true) the be is a chain (object) not a function. Or you could write:

expect(true).to.be.true;
expect(false).to.be.false;
Raulucco
  • 3,406
  • 1
  • 21
  • 27
  • 4
    This expect(myController.message).to.be("Hello"); was not working but this is working expect(myController.message).to.be.equal("Hello"); – Javascript Coder Nov 30 '15 at 07:07
  • 1
    the be is an object that affects the meaning of the tests. Therefor you can't call it as it was a function but you need to access its properties or methods. http://chaijs.com/api/bdd/ – Raulucco Nov 30 '15 at 07:08
  • Fair enough, But when I was running this test in browser mode it was working.. mocha.setup('bdd'); mocha.run(); – Javascript Coder Nov 30 '15 at 07:10
  • Nicely spotted! +1 from me. Had exactly the same problem. – FullStackForger Oct 26 '16 at 23:27
  • 1
    I'm struggling to understand how `expect(x).to.be.true` can be a statement at all (actually after my IDE warned me that this was neither an assignment nor a call). I understand the concept of `to`, `be` etc to be objects, not functions, but since there is no function invocation at all at the end of the statement, where is the code that actually throws an error? Can you write JS code that throws custom errors when merely accessing properties? – JHH May 05 '17 at 11:13
  • Well, I did some research and I guess `Object.defineProperty` with a getter function is what's being used. You learn something every day. – JHH May 05 '17 at 11:20
0

What caused this error for me was getting use to Jasmine's style of assertions and writing the following code with chai:

expect(foo).to.be(bar)

This is incorrect. Chai doesn't seem to have the .to.be() assertion.

Instead, I rewrote it to .to.equal() and things worked.

expect(foo).to.equal(bar)

Use .to.deep.equal() for object equality.

kettanaito
  • 974
  • 5
  • 12