Stubbing a class method with Sinon.js

后端 未结 4 1975
无人共我
无人共我 2020-11-30 18:58

I am trying to stub a method using sinon.js but I get the following error:

Uncaught TypeError: Attempted to wrap undefined property sample_pressure as function

相关标签:
4条回答
  • 2020-11-30 19:31

    The top answer is deprecated. You should now use:

    sinon.stub(YourClass.prototype, 'myMethod').callsFake(() => {
        return {}
    })
    

    Or for static methods:

    sinon.stub(YourClass, 'myStaticMethod').callsFake(() => {
        return {}
    })
    

    Or for simple cases just use returns:

    sinon.stub(YourClass.prototype, 'myMethod').returns({})
    
    sinon.stub(YourClass, 'myStaticMethod').returns({})
    

    Or if you want to stub a method for an instance:

    const yourClassInstance = new YourClass();
    sinon.stub(yourClassInstance, 'myMethod').returns({})
    
    0 讨论(0)
  • 2020-11-30 19:42

    I ran into the same error trying to mock a method of a CoffeeScript class using Sinon.

    Given a class like this:

    class MyClass
      myMethod: ->
        # do stuff ...
    

    You can replace its method with a spy this way:

    mySpy = sinon.spy(MyClass.prototype, "myMethod")
    
    # ...
    
    assert.ok(mySpy.called)
    

    Just replace spy with stub or mock as needed.

    Note that you'll need to replace assert.ok with whatever assertion your testing framework has.

    0 讨论(0)
  • 2020-11-30 19:49

    Thanks to @loganfsmyth for the tip. I was able to get the stub to work on an Ember class method like this:

    sinon.stub(Foo.prototype.constructor, 'find').returns([foo, foo]);
    expect(Foo.find()).to.have.length(2)
    
    0 讨论(0)
  • 2020-11-30 19:50

    Your code is attempting to stub a function on Sensor, but you have defined the function on Sensor.prototype.

    sinon.stub(Sensor, "sample_pressure", function() {return 0})
    

    is essentially the same as this:

    Sensor["sample_pressure"] = function() {return 0};
    

    but it is smart enough to see that Sensor["sample_pressure"] doesn't exist.

    So what you would want to do is something like these:

    // Stub the prototype's function so that there is a spy on any new instance
    // of Sensor that is created. Kind of overkill.
    sinon.stub(Sensor.prototype, "sample_pressure").returns(0);
    
    var sensor = new Sensor();
    console.log(sensor.sample_pressure());
    

    or

    // Stub the function on a single instance of 'Sensor'.
    var sensor = new Sensor();
    sinon.stub(sensor, "sample_pressure").returns(0);
    
    console.log(sensor.sample_pressure());
    

    or

    // Create a whole fake instance of 'Sensor' with none of the class's logic.
    var sensor = sinon.createStubInstance(Sensor);
    console.log(sensor.sample_pressure());
    
    0 讨论(0)
提交回复
热议问题