<p>рд╕рд┐рдиреЙрди рд╕реНрдЯрдм- рдПрдХ рд╡рд░реНрдЧ рдореЗрдВ рддреАрд░ рдХреЗ рдХрд╛рд░реНрдп рдХреЛ рд░реЛрдХ рдирд╣реАрдВ рд╕рдХрддрд╛</p>

рдХреЛ рдирд┐рд░реНрдорд┐рдд 3 рд╕рд┐рддре░ 2016  ┬╖  1рдЯрд┐рдкреНрдкрдгреА  ┬╖  рд╕реНрд░реЛрдд: sinonjs/sinon

  • рд╕рд┐рдиреЙрди рд╕рдВрд╕реНрдХрд░рдг: v2.0.0-pre.2
  • рдкрд░реНрдпрд╛рд╡рд░рдг: рд╡рд┐рдВрдбреЛрдЬ 10
  • рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛ рд░рд╣реА рдЕрдиреНрдп рд▓рд╛рдЗрдмреНрд░реЗрд░реА: рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ, рдмреЗрдмреЗрд▓, рдореЛрдЪрд╛, рдЪрд╛рдп

рдЖрдкрдиреЗ рдХреНрдпрд╛ рд╣реЛрдиреЗ рдХреА рдЙрдореНрдореАрдж рдХреА рдереА?
рдореБрдЭреЗ рдПрдХ рдХрдХреНрд╖рд╛ рдореЗрдВ рдПрдХ рддреАрд░ рд╕рдорд╛рд░реЛрд╣ рдХреЛ рд░реЛрдХрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреА рдЙрдореНрдореАрдж рдереАред

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ
рдореИрдВ рдПрдХ рддреАрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╕реНрдЯрдм рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореИрдВ рдХреНрд▓рд╛рд╕ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╕реНрдЯрдм рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред

FAILED TESTS:
  ExampleClass tests
    ├Ч should stub thisDoesntWork arrow function
      Chrome 52.0.2743 (Windows 10 0.0.0)
    TypeError: Attempted to wrap undefined property thisDoesntWork as function
        at wrapMethod (webpack:///~/sinon/pkg/sinon.js:3138:0 <- test-bundler.js:7377:21)
        at Object.stub (webpack:///~/sinon/pkg/sinon.js:2472:0 <- test-bundler.js:6711:12)
        at Context.<anonymous> (webpack:///src/stores/sinon.test.ts:22:51 <- test-bundler.js:96197:72)

рдХреИрд╕реЗ рдкреБрди: рдкреЗрд╢ рдХрд░реЗрдВ

export class ExampleClass {
    thisWorks() {
        return 0;
    }

    thisDoesntWork = () => {
        return 0;
    }
}

describe("ExampleClass tests", () => {
    it("should stub thisWorks function", () => {
        let stubFunctionA = sinon.stub(ExampleClass.prototype, "thisWorks");
    });
    it("should stub thisDoesntWork arrow function", () => {
        let stubFunctionB = sinon.stub(ExampleClass, "thisDoesntWork");
    });
});
Documentation ES2015+

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рдпрд╣ рдЖрдЧрд╛рдореА рдирдИ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рд╕рд╛рдЗрдЯ рдХреЗ рд▓рд┐рдП рднреЛрдЬрди рд╣реИ рдЬрд╣рд╛рдВ рд╣рдо ES2015 рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдХреБрдЫ рдФрд░ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдЙрдиреНрдореБрдЦ рд▓реЗрдЦ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░рдиреЗ рдХреА рдЙрдореНрдореАрдж рдХрд░рддреЗ рд╣реИрдВред

рдЖрдо рддреМрд░ рдкрд░ рдЬрдм рдЖрдк рдЗрд╕ рддрд░рд╣ рдХреЗ рдореБрджреНрджреЛрдВ рдкрд░ рдЖрддреЗ рд╣реИрдВ рддреЛ рдпрд╣ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рддрдереНрдп рдХреЛ рдпрд╛рдж рд░рдЦрдиреЗ рдореЗрдВ рдмрд╣реБрдд рдорджрджрдЧрд╛рд░ рд╣реЛрддрд╛ рд╣реИ: ES2015 рдЕрдХреНрд╕рд░ рд╕рд╛рдзрд╛рд░рдг ES5 рдирд┐рд░реНрдорд╛рдгреЛрдВ рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рд╕рд┐рдВрдЯреИрдХреНрдЯрд┐рдХ рдЪреАрдиреА рд╣реЛрддрд╛ рд╣реИред рдорддрд▓рдм, рдЬрдм рдЖрдкрдХреЛ рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрддрд╛ рдХрд┐ рдХреБрдЫ рдХреНрдпреЛрдВ рд╣реЛрддрд╛ рд╣реИ (рдпрд╛ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ), рддреЛ рдХреЛрдб рдХреЛ рдЙрд╕рдХреЗ ES5 рд╕рдордХрдХреНрд╖ рдореЗрдВ рдмрджрд▓рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ (рдЬреЛ рдореИрдВрдиреЗ рдЕрднреА рдХрд┐рдпрд╛ рд╣реИ) рдмрд╕ рдЙрджрд╛рд╣рд░рдг рдХреЛрдб рдХреЛ рдмреИрдмреЗрд▓ рдЦреЗрд▓ рдХреЗ рдореИрджрд╛рди рдореЗрдВ рдкреЗрд╕реНрдЯ рдХрд░рдирд╛ рд╣реИ рдФрд░ рджреЗрдЦреЗрдВ рдХрд┐ ES2015/ES6 рдХреЛрдб рдХреНрдпрд╛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддрд╛ рд╣реИ:


Babel . рд╕реЗ рдЯреНрд░рд╛рдВрд╕рдкрд┐рд▓реНрдб рдХреЛрдб

"use strict";

Object.defineProperty(exports, "__esModule", {
    value: true
});

var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

var ExampleClass = exports.ExampleClass = function () {
    function ExampleClass() {
        _classCallCheck(this, ExampleClass);

        this.thisDoesntWork = function () {
            return 0;
        };
    }

    _createClass(ExampleClass, [{
        key: "thisWorks",
        value: function thisWorks() {
            return 0;
        }
    }]);

    return ExampleClass;
}();

рдкрд╣рд▓реА рдмрд╛рдд рдЬреЛ рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рд╡рд╣ рдпрд╣ рд╣реИ рдХрд┐ рддреАрд░ рдХреЗ рдХрд╛рд░реНрдп рдХреЗрд╡рд▓ _instance рддрд░реАрдХреЗ_ рд╣реИрдВред рдЗрд╕рдХрд╛ рдорддрд▓рдм рдХреБрдЫ рдЪреАрдЬреЗрдВ рд╣реИрдВ:

  1. рд╡реЗ рд╡рд╕реНрддреБ рдирд┐рд░реНрдорд╛рдг рддрдХ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИрдВред
  2. рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдХреЗ рдЙрдиреНрд╣реЗрдВ рд╕реНрдЯрдм рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдкрд░ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИрдВ
  3. рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдХреЗ рдЙрдиреНрд╣реЗрдВ рд╕реНрдЯрдм рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЙрдирдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдХреНрд▓реЛрдЬрд░ рдХреЗ рднреАрддрд░ рдЫрд┐рдкреА рд╣реБрдИ рд╣реИред

рдпрд╣ рд╕рдм рдЬрд╛рдирддреЗ рд╣реБрдП, рдмрд╕ рдЕрдкрдиреА рдЕрд╕рдлрд▓ рдкрд░реАрдХреНрд╖рд╛ рдХреЛ рдЗрд╕ рдореЗрдВ рдмрджрд▓рдирд╛ рд╣реИ:

    it("should stub thisDoesntWork arrow function", () => {
        var example = new ExampleClass();
        let stubFunctionB = sinon.stub(example, "thisDoesntWork", () => "actually it does work" );
    });

рдЖрдкрдХреЛ рдХрд╛рдордпрд╛рдмреА рдорд┐рд▓реЗред

>рд╕рднреА рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдпрд╣ рдЖрдЧрд╛рдореА рдирдИ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рд╕рд╛рдЗрдЯ рдХреЗ рд▓рд┐рдП рднреЛрдЬрди рд╣реИ рдЬрд╣рд╛рдВ рд╣рдо ES2015 рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдХреБрдЫ рдФрд░ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдЙрдиреНрдореБрдЦ рд▓реЗрдЦ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░рдиреЗ рдХреА рдЙрдореНрдореАрдж рдХрд░рддреЗ рд╣реИрдВред

рдЖрдо рддреМрд░ рдкрд░ рдЬрдм рдЖрдк рдЗрд╕ рддрд░рд╣ рдХреЗ рдореБрджреНрджреЛрдВ рдкрд░ рдЖрддреЗ рд╣реИрдВ рддреЛ рдпрд╣ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рддрдереНрдп рдХреЛ рдпрд╛рдж рд░рдЦрдиреЗ рдореЗрдВ рдмрд╣реБрдд рдорджрджрдЧрд╛рд░ рд╣реЛрддрд╛ рд╣реИ: ES2015 рдЕрдХреНрд╕рд░ рд╕рд╛рдзрд╛рд░рдг ES5 рдирд┐рд░реНрдорд╛рдгреЛрдВ рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рд╕рд┐рдВрдЯреИрдХреНрдЯрд┐рдХ рдЪреАрдиреА рд╣реЛрддрд╛ рд╣реИред рдорддрд▓рдм, рдЬрдм рдЖрдкрдХреЛ рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрддрд╛ рдХрд┐ рдХреБрдЫ рдХреНрдпреЛрдВ рд╣реЛрддрд╛ рд╣реИ (рдпрд╛ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ), рддреЛ рдХреЛрдб рдХреЛ рдЙрд╕рдХреЗ ES5 рд╕рдордХрдХреНрд╖ рдореЗрдВ рдмрджрд▓рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ (рдЬреЛ рдореИрдВрдиреЗ рдЕрднреА рдХрд┐рдпрд╛ рд╣реИ) рдмрд╕ рдЙрджрд╛рд╣рд░рдг рдХреЛрдб рдХреЛ рдмреИрдмреЗрд▓ рдЦреЗрд▓ рдХреЗ рдореИрджрд╛рди рдореЗрдВ рдкреЗрд╕реНрдЯ рдХрд░рдирд╛ рд╣реИ рдФрд░ рджреЗрдЦреЗрдВ рдХрд┐ ES2015/ES6 рдХреЛрдб рдХреНрдпрд╛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддрд╛ рд╣реИ:


Babel . рд╕реЗ рдЯреНрд░рд╛рдВрд╕рдкрд┐рд▓реНрдб рдХреЛрдб

"use strict";

Object.defineProperty(exports, "__esModule", {
    value: true
});

var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

var ExampleClass = exports.ExampleClass = function () {
    function ExampleClass() {
        _classCallCheck(this, ExampleClass);

        this.thisDoesntWork = function () {
            return 0;
        };
    }

    _createClass(ExampleClass, [{
        key: "thisWorks",
        value: function thisWorks() {
            return 0;
        }
    }]);

    return ExampleClass;
}();

рдкрд╣рд▓реА рдмрд╛рдд рдЬреЛ рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рд╡рд╣ рдпрд╣ рд╣реИ рдХрд┐ рддреАрд░ рдХреЗ рдХрд╛рд░реНрдп рдХреЗрд╡рд▓ _instance рддрд░реАрдХреЗ_ рд╣реИрдВред рдЗрд╕рдХрд╛ рдорддрд▓рдм рдХреБрдЫ рдЪреАрдЬреЗрдВ рд╣реИрдВ:

  1. рд╡реЗ рд╡рд╕реНрддреБ рдирд┐рд░реНрдорд╛рдг рддрдХ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИрдВред
  2. рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдХреЗ рдЙрдиреНрд╣реЗрдВ рд╕реНрдЯрдм рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдкрд░ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИрдВ
  3. рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдХреЗ рдЙрдиреНрд╣реЗрдВ рд╕реНрдЯрдм рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЙрдирдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдХреНрд▓реЛрдЬрд░ рдХреЗ рднреАрддрд░ рдЫрд┐рдкреА рд╣реБрдИ рд╣реИред

рдпрд╣ рд╕рдм рдЬрд╛рдирддреЗ рд╣реБрдП, рдмрд╕ рдЕрдкрдиреА рдЕрд╕рдлрд▓ рдкрд░реАрдХреНрд╖рд╛ рдХреЛ рдЗрд╕ рдореЗрдВ рдмрджрд▓рдирд╛ рд╣реИ:

    it("should stub thisDoesntWork arrow function", () => {
        var example = new ExampleClass();
        let stubFunctionB = sinon.stub(example, "thisDoesntWork", () => "actually it does work" );
    });

рдЖрдкрдХреЛ рдХрд╛рдордпрд╛рдмреА рдорд┐рд▓реЗред

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

andys8 picture andys8  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

JakobJingleheimer picture JakobJingleheimer  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

zimtsui picture zimtsui  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

fearphage picture fearphage  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

kbirger picture kbirger  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ