sinonjs / sinon

Test spies, stubs and mocks for JavaScript.
https://sinonjs.org/
Other
9.6k stars 769 forks source link

`returns` not override `callThrough` #2566

Closed rluvaton closed 8 months ago

rluvaton commented 8 months ago

Describe the bug returns not override callThrough

To Reproduce Run the following:

const sinon = require('sinon');
const assert = require('assert');
class A {
    fn() {
        return 1;
    }
}

const a = new A();

sinon.stub(a, 'fn').callThrough().returns(2);

assert.strictEqual(a.fn(), 2);
assert.strictEqual(a.fn(), 2);
assert.strictEqual(a.fn(), 2);
assert.strictEqual(a.fn(), 2);

Expected behavior this function should return 2 without calling the original function

as resolves and throws does (and maybe even more)

Context (please complete the following information): The reason I call callThrough is because I have a helper function that stub the function but keeping the result (I know you have spy but stub can provide both override and tracking) or if already stubbed does nothing (so there won't be an error for function already stubbed)

replacing returns with callsFake works as expected

fatso83 commented 8 months ago

Thanks for the issue and the PR!

rluvaton commented 8 months ago

Closed as done

fatso83 commented 8 months ago

we don't have LTS releases :) It's just the next major version (which I am not sure when lands).

Anyway, at first I regarded this as a breaking change, but it's really just fixing a bug, so the new patch version is out now.

fatso83 commented 2 months ago

For later reference, the clearing of state turned out too be a bit too aggressive, so fixed this up in #2593