Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

TypeError: 'undefined' is not a function (evaluating 'sinon.spy()')

I'm trying to use sinon.js in testing of a backbone application. But unfortunately I cannot use spy method due to error:

TypeError: 'undefined' is not a function (evaluating 'sinon.spy()')

Here is the steps to reproduce the error:

  1. Create an empty project with backbone yeoman generator
  2. Install sinon: cd test && bower install sinon
  3. Include in test/index.html <script src="bower_components/sinon/lib/sinon.js"></script>
  4. Create spy in test/spec/test.js:

    describe('Give it some context', function () {
        describe('maybe a bit more context here', function () {
            it('should run here few assertions', function () {
              var spy = sinon.spy();
              spy.should.be.ok;
            });
        });
    });
    
  5. Run the test with grunt: grunt test

  6. The test will fail with a described error.

Could anyone help to find out what is wrong?

like image 989
Sergey Avatar asked Dec 13 '13 15:12

Sergey


3 Answers

I'll just leave here the list of files that sinon conveniently forgets to load if it is loaded as a <script> or with require.js (as AMD module) - basically anything else than in node.js:

"sinon/lib/sinon.js",
"sinon/lib/sinon/spy.js",
"sinon/lib/sinon/call.js",
"sinon/lib/sinon/behavior.js",
"sinon/lib/sinon/stub.js",
"sinon/lib/sinon/mock.js",
"sinon/lib/sinon/collection.js",
"sinon/lib/sinon/assert.js",
"sinon/lib/sinon/sandbox.js",
"sinon/lib/sinon/test.js",
"sinon/lib/sinon/test_case.js",
"sinon/lib/sinon/match.js"

Feel free to skip any of those but expect sinon to fail in curious ways.

like image 107
Kamil Szot Avatar answered Nov 10 '22 00:11

Kamil Szot


It turned out that such functionality as spies, stubs, etc should be added manually by including scripts from lib/sinon folder. This fact is mentioned in Installation section. And due to the code of the core sinon.js file only in Node.js environment it is done automatically.

like image 13
Sergey Avatar answered Nov 09 '22 22:11

Sergey


I encountered the same problem with sinon 1.17.2 and Chrome 47.0. After trying the above solutions and variations of those, I ended up using the nuclear option and switching to Jasmine.

For my test suite, it only took about 15 minutes of some global find-and-replace to convert my chai 'expects' into Jasmine ones and some differences around mocha before syntax; Jasmine flagged the unexpected syntax clearly. Jasmine spy objects were a fine substitute for sinon.

like image 2
Jason Avatar answered Nov 09 '22 23:11

Jason