Sinon: ์ŠคํŒŒ์ด `returnValue`๋Š” ์ƒ์„ฑ๊ธฐ์™€ ํ•จ๊ป˜ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์— ๋งŒ๋“  2015๋…„ 01์›” 03์ผ  ยท  20์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: sinonjs/sinon

์ƒ์„ฑ๊ธฐ ํ•จ์ˆ˜๋กœ ์ž‘์—…ํ•  ๋•Œ ์ŠคํŒŒ์ด์˜ ๋ฐ˜ํ™˜ ๊ฐ’์€ ํ•ญ์ƒ undefined ์ž…๋‹ˆ๋‹ค. ๋‹ค์Œ์€ ์‹คํŒจํ•œ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์ž…๋‹ˆ๋‹ค.

require('should');

var sinon = require('sinon');
var co = require('co');

var foo = {
  bar: function() {
    return 'bar';
  },
  biz: function *() {
    return 'biz';
  }
}

describe('Return value', function() {
  it('should work with regular functions', function() {
    sinon.spy(foo, 'bar');

    foo.bar();

    foo.bar.firstCall.returnValue.should.equal('bar');
  });

  it('should work with generator functions', co.wrap(function*() {
    sinon.spy(foo, 'biz');

    var result = yield foo.biz();

    result.should.equal('biz');
    foo.biz.firstCall.returnValue.should.equal('biz');
  }));
});

npm install co mocha should sinon && ./node_modules/.bin/mocha --harmony index.js ๋กœ ์‹คํ–‰ํ•˜์‹ญ์‹œ์˜ค.

2.x Unverified

๋ชจ๋“  20 ๋Œ“๊ธ€

Sinon์€ ์•„์ง ES6 ๊ธฐ๋Šฅ์„ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด ์ž‘์—…์€ ์•„์ง ์‹œ์ž‘๋˜์ง€ ์•Š์•˜์œผ๋ฏ€๋กœ ์–ธ์ œ ์ž‘๋™ํ• ์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

@mantoni , ๋งž์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๊ธฐ๋Šฅ ์š”์ฒญ์— ๋” ๊ฐ€๊น์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋กœ๋“œ๋งต์— ์ถ”๊ฐ€๋  ๋•Œ ์‰ฝ๊ฒŒ ๋‹ค์‹œ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋„๋ก ์ผ์ข…์˜ ํƒœ๊ทธ("es6"?)์™€ ํ•จ๊ป˜ ์—ด์–ด ๋‘์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? -ํ•ด์•ผ ํ•  ์ผ์„ ํ‰๊ฐ€ํ•˜๋Š”๊ฐ€?

์ด๊ฒƒ์€ ์ข‹์€ ๊ธฐ๋Šฅ์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@ruimarinho ๋‚ด๊ฐ€ ์ด๊ฒƒ์„ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค https://github.com/ingameio/SinonES6.JS
require("sinon")์„ require("sinon-es6")์œผ๋กœ ๋ฐ”๊พธ๋ฉด ํ…Œ์ŠคํŠธ๋ฅผ ํ†ต๊ณผํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

--
2017๋…„ 6์›” 22์ผ @fatso83 ์˜ ํŽธ์ง‘:
์ด๊ฒƒ์€ ์‚ฌ์‹ค์ด ์•„๋‹Œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด๊ฒƒ์„ ์ˆ˜๋™์œผ๋กœ ํ…Œ์ŠคํŠธํ–ˆ๋‹ค. sinon-es6 _๋งŒ ์กฐ๋กฑ ์„ ์œ„ํ•œ ์ƒ์„ฑ๊ธฐ์— ๋Œ€ํ•œ ์ง€์›์„ ๊ตฌํ˜„ํ•˜๋ฏ€๋กœ ์™„์ „ํžˆ ์˜๋ฏธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ์ž‘์—…์„ ํ•˜๋Š” ์‚ฌ๋žŒ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

@emgeee ๋‚ด๊ฐ€ ์•Œ๊ณ ์žˆ๋Š” ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค.

+1 es6 ๊ธฐ๋Šฅ์ด ์žˆ๋Š” @ruimarinho sinon.js๊ฐ€ ์žˆ์œผ๋ฉด ์ •๋ง ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค!

@ingameio ๊ฐ€ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์œผ๋กœ PR์„ ํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

@fatso83 ์ œ์•ˆ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!
๊ณง ํ™๋ณดํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค ;)

ํŒจํ‚ค์ง€ ๋ฒ„์ „์— ๋Œ€ํ•ด buster-test๋ฅผ ์‹คํ–‰ํ•  ๋•Œ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋””๋ฒ„๊น…์„ ์ข€ ํ•ด๋ณด์•˜์ง€๋งŒ ์š”์ฆ˜ ์‹œ๊ฐ„์ด ์—†์–ด์„œ ๋ฌธ์ œ๋ฅผ ํ’€์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.
๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋‚ด ํฌํฌ๋กœ ํ‘ธ์‹œํ•  ์ˆ˜ ์žˆ๋„๋ก ๋•๊ณ  ์‹ถ๋‹ค๋ฉด ์ €์—๊ฒŒ ๋ง์”€ํ•ด ์ฃผ์‹ญ์‹œ์˜ค.

@gaguirre ๋ฐ˜๊ฐ€์šด ์†Œ์‹์ž…๋‹ˆ๋‹ค. Maximillian์€ ๋ฐฉ๊ธˆ ๋ชจ๋“  ํ…Œ์ŠคํŠธ๋ฅผ Mocha๋กœ ๋ณ€ํ™˜ํ•˜๊ณ  ํ…Œ์ŠคํŠธ ์„ค์ •์„ ์•ฝ๊ฐ„ ๋ณ€๊ฒฝํ–ˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ master ์—์„œ ์ตœ์‹  ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๊ฐ€์ ธ์˜ค๋ฉด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

@gaguirre ๋ˆ„๊ตฐ๊ฐ€ ์ด ์Šค๋ ˆ๋“œ๋ฅผ ์šฐ์—ฐํžˆ ๋ณด๊ฒŒ ๋  ๊ฒฝ์šฐ๋ฅผ ๋Œ€๋น„ํ•˜์—ฌ ์ง€๋‚˜๊ฐ€๋Š” ์‚ฌ๋žŒ์ด ๋ณผ ์ˆ˜ ์žˆ๋„๋ก ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ํฌํฌ๋กœ ํ‘ธ์‹œํ•˜๋Š” ๊ฒƒ์ด ์•„์ด๋””์–ด์ผ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@fatso83 ์ฒซ ๋ฒˆ์งธ ๋ฒ„์ „ ์„ underscope/sinon ์œผ๋กœ ํ‘ธ์‹œํ–ˆ์Šต๋‹ˆ๋‹ค.
์ฃผ์š” ๋ฌธ์ œ๋Š” es6(์ด ๊ฒฝ์šฐ phantomjs)์„ ์ง€์›ํ•˜์ง€ ์•Š๋Š” ์—”์ง„์œผ๋กœ ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•  ๋•Œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ฝ”๋“œ๋ฅผ ๊ตฌ๋ฌธ ๋ถ„์„ํ•  ๋•Œ ์‹คํŒจํ•˜๋ฏ€๋กœ eval() ๋ฅผ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์œผ๋กœ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์žก๋‹ค. ๋‚˜๋Š” ์ด๊ฒƒ์ด ๋ฐ›์•„๋“ค์—ฌ์งˆ ์ˆ˜ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ๊ทธ๊ฒƒ์€ ์ถœ๋ฐœ์ ์ด๋‹ค.

์ง€๊ธˆ์€ ์ƒ์„ฑ๊ธฐ ํ˜ธ์ถœ์„ ๋‹ค๋ฅธ ํŒŒ์ผ๋กœ ๋ž˜ํ•‘ํ•˜์—ฌ ๋™์ ์œผ๋กœ ์š”๊ตฌํ•˜๊ณ  ์žˆ์ง€๋งŒ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. browserify๊ฐ€ ๋™์ ์œผ๋กœ ํ•„์š”ํ•œ ํŒŒ์ผ๋„ ๋ฒˆ๋“ค๋กœ ๋ฌถ๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. npm run test-headless ์‹คํ–‰ํ•  ๋•Œ ์ผ๋ถ€ ํŒŒ์ผ์„ ์ œ์™ธํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

์–ด๋–ค ๊ฒƒ์ด ์ตœ์„ ์˜ ํ•ด๊ฒฐ์ฑ…์ด ๋  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์‹ญ๋‹ˆ๊นŒ?

ํ”ผ๋“œ๋ฐฑ์„ ๋ณด๋‚ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. @gaguirre . ๋”ฐ๋ผ์„œ ๊ธฐ๋ณธ์ ์ธ ๋ฌธ์ œ๋Š” ์—”์ง„์ด ์ง€์›ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ๊ตฌ๋ฌธ ๋ถ„์„์„ ํ”ผํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ํ•„์š”ํ•˜๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. WebWorkers ๋“ฑ๊ณผ ๊ฐ™์ด ๋‹จ์ˆœํ•œ ๊ธฐ๋Šฅ ๊ฐ์ง€๋ณด๋‹ค ์•ฝ๊ฐ„ ์–ด๋ ต์Šต๋‹ˆ๋‹ค.

์‹ค์ œ ๊ฒ€์‚ฌ๋ฅผ ์œ„์ž„ํ•˜๋Š” ๊ฒƒ์€ if(require('generator-support')){ ... } ๋งŒํผ ๊ฐ„๋‹จํ•˜์ง€๋งŒ ์‹ค์ œ ๊ตฌ๋ฌธ ๋ถ„์„ ๋ฌธ์ œ๋Š” ํ•ด๊ฒฐ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@mantoni ์™€ @mroderick, ์ด๊ฒƒ์„ ๊น”๋”ํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์•„์ด๋””์–ด๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

์ถ”์‹ : ์ €๋Š” ๋ช‡ ์‹œ๊ฐ„ ํ›„์— ์˜คํ”„๋ผ์ธ-ํœด๊ฐ€๋กœ ๋–จ์–ด์ ธ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ถ€ํ™œ์ ˆ ์ดํ›„ ์–ผ๋งˆ ๋™์•ˆ ๋‹ต๋ณ€์„ ์ฝ์„ ์ˆ˜ ์—†์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด ์ˆ˜์ค€์˜ ์ƒ์„ฑ๊ธฐ ์Šคํ„ฐ๋น™์ด ์‹ค์ œ๋กœ ์ž‘๋™ํ•˜๋Š”์ง€(ํŠนํžˆ ์ฝ”๋ฃจํ‹ด ์ง€ํ–ฅ ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ) ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋น„๋™๊ธฐ ๋™์ž‘์˜ ์ผ๋ถ€ ์—๋ฎฌ๋ ˆ์ด์…˜์ด ์ˆœ์„œ๋Œ€๋กœ ๋  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ตฌ๋ฌธ ๋ถ„์„ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ œ์•ˆ :

์ƒ์„ฑ๊ธฐ ์ฝ”๋“œ๋ฅผ ๋ณ„๋„์˜ ํŒŒ์ผ๋กœ ์ถ”์ถœํ•˜๊ณ  ์ƒ์„ฑ๊ธฐ ํ•จ์ˆ˜๋ฅผ ๋ž˜ํ•‘ํ•  ๋•Œ ์š”์ฒญ ์‹œ์—๋งŒ ํ•ด๋‹น ํŒŒ์ผ์„ require() ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ:

?/es6-support.js:

"use strict";

exports.getGeneratorWrapper = function(method, ctx, args) {
    return function* () {
        return mockObject.invokeMethod(method, ctx, args);
    }
}

lib/sinon/mock.js->์˜ˆ์ƒ...:

var wrapper = function () {
    return mockObject.invokeMethod(method, this, arguments);
});

if (/^function\s*\*/.test(method.toString())) {
    wrapper = require('es6-support').getGeneratorWrapper(method, this, arguments);
}

wrapMethod(this.object, method, wrapper);

(๋˜ํ•œ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ์™€ ์œ ์‚ฌํ•˜๊ฒŒ ์ˆ˜ํ–‰ํ•˜๊ณ  ์ฝ”๋“œ ๊ฒ€์‚ฌ ์ถ”์ ์œผ๋กœ ์ธํ•ด 'es6-support' ํŒŒ์ผ์ด ์ž๋™์œผ๋กœ ํฌํ•จ๋˜์ง€ ์•Š๋Š”์ง€ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค.)

๋Œ€์•ˆ ์ œ์•ˆ :

sinon 2.0์ด ์ถœ์‹œ๋  ์ค€๋น„๊ฐ€ ๋˜์—ˆ์„ ๋•Œ ES5 ํ˜ธํ™˜์„ฑ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹๊ฐ€์น˜ ์žˆ๋Š” ๋ชฉํ‘œ๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๊นŒ? ์•„๋งˆ๋„ ํŠธ๋žœ์ŠคํŒŒ์ผ๋Ÿฌ ์‚ฌ์šฉ์ž ์—†์ด ์—ฌ์ „ํžˆ ๋ ˆ๊ฑฐ์‹œ ES5 ์ „์šฉ ํ™˜๊ฒฝ์„ ์ง€์›ํ•˜๋Š” ์†Œ์ˆ˜์˜ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ 1.x์—์„œ ๋‚จ๊ฒจ์งˆ ๊ฒƒ์ด๋ผ๊ณ  ๋งํ•  ๋•Œ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@evan-king ์กฐ๊ฑด๋ถ€ ์š”๊ตฌ ์‚ฌํ•ญ์€ ๋ธŒ๋ผ์šฐ์ € ๋นŒ๋“œ์—์„œ ์ค‘๋‹จ๋˜๋ฏ€๋กœ ์†”๋ฃจ์…˜์ด ์•„๋‹™๋‹ˆ๋‹ค. ์กฐ๊ฑด๋ถ€ ์š”๊ตฌ๋Š” ์ข…์†์„ฑ ๊ทธ๋ž˜ํ”„์˜ ์ •์  ๋ถ„์„์„ ๋ฌดํšจํ™”ํ•˜๋ฏ€๋กœ WebPack, Rollup ๋ฐ Browserify์™€ ๊ฐ™์€ ๋„๊ตฌ๋Š” ์ด๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์™„์ „ํžˆ ๋“ค์–ด๊ฐ€๊ฑฐ๋‚˜ ์™„์ „ํžˆ ๋น ์ ธ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์˜ˆ, ES5 ํ˜ธํ™˜์„ฑ์€ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ES6 ์ƒ์„ฑ๊ธฐ ์ง€์› ์€ ๊ธฐ๊ปํ•ด์•ผ ์กฐ์•…ํ•˜๊ณ  ์‚ฌ๋žŒ๋“ค์ด ํ”„๋กœ์ ํŠธ์— Sinon์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ์ถ”๊ฐ€ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ๊ฐ•์š”ํ•˜๋ฉด ํ…Œ์ŠคํŠธ ์ˆ˜ํ–‰์˜ ๊ธฐ์ค€์ด ๋†’์•„์ง‘๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ๊ทธ ๋ฌธํ„ฑ์€ ์žˆ๋Š” ๊ทธ๋Œ€๋กœ ์ถฉ๋ถ„ํžˆ ๋†’์Šต๋‹ˆ๋‹ค. ์Šคํฌ๋ฆฝํŠธ ํƒœ๊ทธ๋ฅผ ํฌํ•จํ•˜์—ฌ ์ž‘๋™ํ•˜๋„๋ก ํ•˜๋Š” ๊ฒƒ์€ IMHO์˜ ์ค‘์š”ํ•œ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์–ธ์  ๊ฐ€ ES5 ํ˜ธํ™˜์„ฑ์„ ๊นจ๋œจ๋ฆด ์ˆ˜ ์žˆ์ง€๋งŒ ๋กœ๋“œ๋งต์— ์—†๊ณ  Sinon 3์— ๋Œ€ํ•ด ๋…ผ์˜์กฐ์ฐจ ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. Sinon 2๋Š” ์‚ฌ์‹ค์ƒ ๋‚˜์˜จ ์ง€ ๊ฝค ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ๊ณต์‹ ์ถœ์‹œ๋ฅผ ํ•˜์ง€ ๋ชปํ•˜๊ฒŒ ๋ง‰๋Š” ์•ฝ๊ฐ„์˜ ์„ฑ๊ฐ€์‹  ์ผ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๊ธฐ์กด ES5 ๋Ÿฐํƒ€์ž„ ํ˜ธํ™˜์„ฑ์„ ๊นจ๋œจ๋ฆฌ์ง€ ์•Š๊ณ  ES6 ํ˜ธํ™˜์„ฑ์„ ์–ป๋Š” ๋ฐฉ๋ฒ•์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋‘ ๊ฐ€์ง€๊ฐ€ ์žˆ์œผ๋ฉฐ, ๋งˆ์ง€๋ง‰ ๋ฐฉ๋ฒ•์€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค(ํ…Œ์ŠคํŠธํ•˜์ง€ ์•Š์Œ).

๋ชจ๋“ˆ์˜ ์กฐ๊ฑด๋ถ€ ํ‰๊ฐ€

์ด๊ฒƒ์€ ํ•ดํ‚น์ด์ง€๋งŒ ์ƒ๋‹นํžˆ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์˜๋ฏธํ•˜๋Š” ๋ฐ”๋Š” ์šฐ๋ฆฌ๊ฐ€ ํ•„์š”ํ•œ ๋ชจ๋“ˆ์„ ํ‰๊ฐ€ํ• ์ง€ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•˜๊ธฐ ์œ„ํ•ด ์ •์  ์ž์‚ฐ ์ธ๋ผ์ด๋‹ ๋ฐ ES6 ๊ธฐ๋Šฅ ํ…Œ์ŠคํŠธ์— ์˜์กดํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ES5 ํ˜ธํ™˜์„ฑ์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค(Sinon์€ ๋Ÿฐํƒ€์ž„์ด ๊ตฌ๋ฌธ์„ ์ง€์›ํ•˜๋Š” ๊ฒฝ์šฐ์—๋งŒ ํŒจ์น˜๋ฉ๋‹ˆ๋‹ค). ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ œ์ž‘์ž ์ธก์ด๋‚˜ ํด๋ผ์ด์–ธํŠธ ์‚ฌ์šฉ์ž ๋ชจ๋‘์—์„œ Babel ํ˜•ํƒœ์˜ ์ถ”๊ฐ€ ๋„๊ตฌ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์œผ๋ฉฐ ES6์„ ํ…Œ์ŠคํŠธํ•˜๋ฉด ES5 ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ค‘๋‹จ๋ฉ๋‹ˆ๋‹ค. ์–ด๋–ค ๊ฒฝ์šฐ์—๋„ ์‹คํŒจํ–ˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

brfs ์™€ ๊ฐ™์€ ๊ฒƒ์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋ฉด ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

_๋Ÿฐํƒ€์ž„ ๊ธฐ๋Šฅ.js_

var features = {};
try { 
    new Function("var foo = function* foo(){ }") ;
    features.generatorSupport = true; 
} 
catch(err){ features.generatorSupport = false; }
module.exports = features;

_es6-generator-wrapper.js_

return function* () {
    return mockObject.invokeMethod(method, ctx, args);
}

_es6.js_

var features = require('./runtime-features');

if( features.generatorSupport ) {
    var code = fs.readFileSync('./es6-generator-wrapper.js');
    module.exports.getGeneratorWrapper = new Function("mockObject", "method", "ctx", "args", code);
} else {
    module.exports.getGeneratorWrapper = function() { throw new TypeError("You tried using a generator function in a runtime only capable of running ES5 code"); }
}

๋ฐ”๋ฒจ๋ฆฌํŒŒ์ž‰ ์‹œ๋…ผ

์ด๊ฑด ์ œ๊ฐ€ ์‹ค์ œ๋กœ ํ•ด๋ณด์ง€ ์•Š์•„์„œ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. Babel์„ ํ†ตํ•ด ๋นŒ๋“œ๋ฅผ ES5๋กœ ๋ณ€ํ™˜ํ•˜๋ฉด ES6 ์ฝ”๋“œ๋ฅผ ์—ฌ๊ธฐ์ €๊ธฐ์— ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๊ณ  ์œ„์—์„œ ํ–ˆ๋˜ ๊ฒƒ์ฒ˜๋Ÿผ ์ ํ”„๋ฅผ ํ”ผํ•˜๊ณ  ์ƒ์„ฑ๊ธฐ์— ๋Œ€ํ•ด ๋™์ผํ•œ ์ข…๋ฅ˜์˜ ๊ฒ€์‚ฌ๋ฅผ ๊ณ„์† ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ๋“ค์€ ES5 ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌํ˜„๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ฌผ๋ก  ES5 ๋ธŒ๋ผ์šฐ์ €์—์„œ ES6์„ ํ…Œ์ŠคํŠธํ•˜๋Š” ๊ฒƒ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹์‹คํŒจํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ํด๋ผ์ด์–ธํŠธ ์ธก์˜ ์ด์ „ ๊ฒƒ๊ณผ ๋™์ผํ•œ ์žฅ์ ์ด ์žˆ์ง€๋งŒ yield , async , function*() ์™€ ๊ฐ™์€ ํ•ญ๋ชฉ์— ๋Œ€ํ•œ ES2015 ์ง€์‹์ด ๋„๋‹ฌํ•˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ธฐ์—ฌ๋ฅผ ๋ฐฉํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋„“์€ ์ฒญ์ค‘.

+1

@rpavlovs , ์Šค๋ ˆ๋“œ์— +1์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์€ ์‹ค์ œ๋กœ ์˜๋ฏธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. GitHub UI์—๋Š” ๊ฐ์ •์„ ํ‘œํ˜„ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ๊ฐ ๋Œ“๊ธ€ ์ƒ๋‹จ์— "๋ฐ˜์‘ ์ถ”๊ฐ€" ๋ฒ„ํŠผ์ด ์žˆ์Šต๋‹ˆ๋‹ค. +1์€ ์•„๋ฌด ๊ฒƒ๋„ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด์— ์œ„์˜ ์ œ์•ˆ ์ค‘ ํ•˜๋‚˜(๋˜๋Š” ๋” ์˜๋ฆฌํ•œ ๊ฒƒ)๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ํ’€ ๋ฆฌํ€˜์ŠคํŠธ๋Š” ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ๊ฐ€๋Šฅ์„ฑ์ด ํ›จ์”ฌ ๋” ๋†’์Šต๋‹ˆ๋‹ค ๐Ÿ˜„

์ œ๋„ˆ๋ ˆ์ดํ„ฐ์— ๋Œ€ํ•œ API ์ง€์›์ด ์–ด๋–ป๊ฒŒ ๋ณด์ผ์ง€ ์— ๋Œ€ํ•œ ์˜๊ฒฌ์„ ๋“ฃ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์ด์— ๋Œ€ํ•ด ๋ช‡ ์‹œ๊ฐ„์„ ์‚ฌ์šฉํ•œ ํ›„์—๋„ ์‚ฌ๋žŒ๋“ค์ด ๋ฌด์—‡์„ ๋ณด๊ณ  ์‹ถ์–ดํ•˜๋Š”์ง€ ์•„์ง ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด๋ฅผ ๊ตฌ์ฒดํ™”ํ•˜๊ธฐ ์œ„ํ•ด @ingameio ์˜ ๋ชจ์˜ API ์ˆ˜์ • ์‚ฌํ•ญ์„ ์œ ์ง€ํ•˜๋ฉด์„œ ๋™์‹œ์— ES5 ํ˜ธํ™˜์„ฑ์„ ๊นจ๋œจ๋ฆฌ์ง€ ์•Š๋Š” ์ƒˆ ๋ถ„๊ธฐ ๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค(์œ„์—์„œ ์–ธ๊ธ‰ํ•œ ํ•ดํ‚น ์‚ฌ์šฉ).

๋‚˜๋ฅผ ์กฐ๊ธˆ ์งœ์ฆ๋‚˜๊ฒŒ ํ•˜๋Š” ๊ฒƒ์€ ํ…Œ์ŠคํŠธ ์˜ˆ์ œ๊ฐ€ ์ž‘๋™ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— Ingameio์—์„œ ์›๋ž˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ํ…Œ์ŠคํŠธํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ •๋ง๋กœ ๋งํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํฌํฌ์˜ ์˜ˆ์ œ๋„ ์™„์ „ํ•˜์ง€ ์•Š๊ณ  ์‚ฌ์ „/ํฌ์ŠคํŠธ๋ฅผ ๊นจ๋Š” ํ•ญ๋ชฉ์„ ์–ป์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋ณ€๊ฒฝ.

๋ฐœ์ „๊ธฐ๋Š” ๋‹จ์ˆœํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ณผ๊ฑฐ๋ฅผ ๊ธฐ์–ตํ•˜๋Š” ๋ถ€๋“œ๋Ÿฌ์šด ๋™๊ธฐ์  ์กด์žฌ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ co ๋ฐ ๊ด€๋ จ๋˜์ง€ ์•Š์€ ๋‹ค๋ฅธ ๊ฒƒ์œผ๋กœ ์˜ˆ์ œ๋ฅผ ์ˆ˜์ˆ˜๊ป˜๋ผ๋กœ ๋งŒ๋“ค์ง€ ๋งˆ์‹ญ์‹œ์˜ค. ์›ํ•˜๋Š”/์ž˜๋ชป๋œ ๊ฒƒ์„ ๋ณด๊ธฐ๊ฐ€ ๋” ์–ด๋ ต๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์œ„์˜ ์˜ˆ๋Š” ๋งค์šฐ ๋ณต์žกํ•˜๊ณ  "yield expression"์˜ ๋ฐ˜ํ™˜ ๊ฐ’์ด "yield value"์™€ ๊ฐ™์„ ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•˜๊ธฐ ๋•Œ๋ฌธ์— yield ๊ฐ€ ํ•˜๋Š” ์ผ์„ ์ž˜๋ชป ์ดํ•ดํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ˆ˜์ต๋ฅ ์˜ result ๋Š” ์ƒ์„ฑ๊ธฐ์˜ next() ( MDN )์— ์ „๋‹ฌ๋œ ๊ฐ’์ž…๋‹ˆ๋‹ค.

co ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์˜ˆ์ œ๋Š” ์•„๋งˆ๋„ Mocha ํ…Œ์ŠคํŠธ์—์„œ yield ๋ฅผ ์ง์ ‘ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์„ ๋•Œ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ IIFE๋กœ ์˜ˆ์ œ๋ฅผ ๋ž˜ํ•‘ํ•˜๊ฑฐ๋‚˜ ๋™์ผํ•œ ๊ฒฐ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์œผ๋กœ ๋” ๋ช…ํ™•ํ•˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด.

์ด๊ฒƒ์€ ์ƒ์„ฑ๊ธฐ๊ฐ€ ์ง€์›ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ๊ฐ„๋‹จํ•œ ํ…Œ์ŠคํŠธ์ž…๋‹ˆ๋‹ค(์˜ค๋Š˜๋‚ ์˜ Sinon์—์„œ ์ž‘๋™ํ•จ).

require("should");

var sinon = require("../sinon");

var foo = {
    bar: function () {
        return "bar";
    },
    biz: function *() {
        return "biz";
    }
};

describe("generator support", function () {
    it('should work with generator functions',  function(){
        var spy = sinon.spy(foo, 'biz');

        var iterator = foo.biz();
        var result = iterator.next();

        result.value.should.equal('biz');
        result.done.should.equal(true);
        spy.firstCall.returnValue.should.be.an.Object();
        spy.firstCall.returnValue.next.should.be.a.Function();
    });
});

์ด์ œ ์–ด๋–ค API ํ™•์žฅ์„ ์›ํ• ๊นŒ์š”?
์›๋ž˜ ํ…Œ์ŠคํŠธ์—์„œ ๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒƒ์„ ๋ณด๊ณ  ์‹ถ์–ดํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.

foo.biz.firstGeneratedValue.should.equal('biz');
๋˜๋Š”
foo.biz.generatedValue[0].should.equal('biz');
?

cc @ruimarinho

์›๋ž˜ ํ…Œ์ŠคํŠธ์— ์˜ค๋ฅ˜๊ฐ€ ์žˆ์—ˆ๊ณ  Sinon์—์„œ ๋ฐœ์ „๊ธฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐ ๋ฌธ์ œ๊ฐ€ ์—†์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด ๋ฌธ์ œ๋ฅผ ๋‹ซ์Šต๋‹ˆ๋‹ค.

์ƒ์„ฑ๊ธฐ(๋ฐ ๊ด€๋ จ ๋ฐ˜๋ณต๊ธฐ)๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ API๊ฐ€ ๋ฌธ์ œ #1467์—์„œ ์–ด๋–ป๊ฒŒ ๋ณด์ด๋Š”์ง€์— ๋Œ€ํ•œ ํ† ๋ก ์— ์ฐธ์—ฌํ•˜์„ธ์š”.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰