{
    "componentChunkName": "component---src-templates-blog-post-jsx",
    "path": "/post/test-backbone-with-sinon/",
    "result": {"data":{"site":{"siteMetadata":{"title":"WEB EGG","author":"Leko - CTO at Yuimedi"}},"markdownRemark":{"id":"feb349a8-ed73-5181-90f6-614e52616082","excerpt":"こんにちは。 最近、Backbone.jsというライブラリを使って、制作をしています。 Backboneいいですね〜。 各UIパーツの結合度が下がるので、 全体の見通しが良くなり、メンテもしやすくなります。 今作っているものはそこまで規模が大きいものではないのですが、 大規模js…","html":"<p>こんにちは。<br>\n最近、<a href=\"http://backbonejs.org/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Backbone.js</a>というライブラリを使って、制作をしています。</p>\n<p>Backboneいいですね〜。<br>\n各UIパーツの結合度が下がるので、<br>\n全体の見通しが良くなり、メンテもしやすくなります。</p>\n<p>今作っているものはそこまで規模が大きいものではないのですが、<br>\n大規模js開発入門ということで。</p>\n<p>それに加えて、先日<a href=\"http://connpass.com/event/1664/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">JavaScript道場</a>に行ってきてから、<br>\njsの開発でもテストコードを書くようにしています。</p>\n<p><a href=\"http://hokaccha.github.com/slides/javascript_design_and_test/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">師範に習った</a>とおり、<br>\n<em><span class=\"removed_link\" title=\"http://visionmedia.github.com/mocha/\">mocha</span></em> + <em><a href=\"https://github.com/LearnBoost/expect.js/blob/master/README.md\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">expectjs</a></em> + _<a href=\"http://sinonjs.org/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">sinonjs</a>_を用いてユニットテストを書いているのですが、<br>\nそのテストを書いている時に、sinonjsのspyで詰まったのでメモ。</p>\n<!--more-->\n<h2 id=\"sinonjs-spyの使い道使い方\" style=\"position:relative;\"><a href=\"#sinonjs-spy%E3%81%AE%E4%BD%BF%E3%81%84%E9%81%93%E4%BD%BF%E3%81%84%E6%96%B9\" aria-label=\"sinonjs spyの使い道使い方 permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>sinonjs spyの使い道・使い方</h2>\n<p>そもそも、<strong>sinonjs</strong>とは何か。<br>\nそしてその中の<strong>spy</strong>という機能は何なのかをざっと。</p>\n<p>sinonjsとは、テストダブルのライブラリのことです。</p>\n<blockquote>\n<p>テストダブル (Test Double) とは、ソフトウェアテストにおいて、テスト対象が依存しているコンポーネントを置き換える代用品のこと。ダブルは代役、影武者を意味する。 – テストタブル – wikipedia<br>\n<a href=\"http://hokaccha.github.com/slides/javascript_design_and_test/#page93\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">フロントエンドJavaScriptにおける設計とテスト</a></p>\n</blockquote>\n<p>すごくざっくり言うと、<strong>テスト用の便利なライブラリ</strong>です。</p>\n<p>そして、そんなsinonjsのspyという機能は、 その名の通り<strong>スパイをしてくれます。</strong></p>\n<p>何のスパイをするかというと、任意の関数に忍び込ませて、</p>\n<ul>\n<li>その関数が呼ばれたか否か</li>\n<li>合計で何回関数が呼ばれているか</li>\n<li>その引数は何か</li>\n</ul>\n<p>などなどを調べることが出来るのが、spyです。</p>\n<p>ざっくりした使い方を書くと、</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token function\">it</span><span class=\"token punctuation\">(</span><span class=\"token string\">'sinon.spyのテスト'</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">function</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">var</span> hoge<span class=\"token punctuation\">,</span> spy<span class=\"token punctuation\">;</span>\n    hoge <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token function-variable function\">foo</span><span class=\"token operator\">:</span> <span class=\"token keyword\">function</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n            <span class=\"token keyword\">return</span> <span class=\"token boolean\">true</span><span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n    spy <span class=\"token operator\">=</span> sinon<span class=\"token punctuation\">.</span><span class=\"token function\">spy</span><span class=\"token punctuation\">(</span>hoge<span class=\"token punctuation\">,</span> <span class=\"token string\">'foo'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    hoge<span class=\"token punctuation\">.</span><span class=\"token function\">foo</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">return</span> <span class=\"token function\">expect</span><span class=\"token punctuation\">(</span>spy<span class=\"token punctuation\">.</span>calledOnce<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>to<span class=\"token punctuation\">.</span>be<span class=\"token punctuation\">.</span><span class=\"token function\">ok</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>という感じに書けます。</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\">spy <span class=\"token operator\">=</span> sinon<span class=\"token punctuation\">.</span><span class=\"token function\">spy</span><span class=\"token punctuation\">(</span> object<span class=\"token punctuation\">,</span> <span class=\"token string\">'proterty'</span> <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>というふうに書くと、object.propertyを監視出来ます。 この感じで、Backboneのon系のコールバックも見えるんじゃないかと思ったら、詰まりました。</p>\n<h2 id=\"これで動くんじゃないの-動かない\" style=\"position:relative;\"><a href=\"#%E3%81%93%E3%82%8C%E3%81%A7%E5%8B%95%E3%81%8F%E3%82%93%E3%81%98%E3%82%83%E3%81%AA%E3%81%84%E3%81%AE-%E5%8B%95%E3%81%8B%E3%81%AA%E3%81%84\" aria-label=\"これで動くんじゃないの 動かない permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>これで動くんじゃないの？ →動かない</h2>\n<p>動かなかったコードを簡略化したものがこちらです。</p>\n<p>少し長いのでCoffeeScriptで書きます。</p>\n<div class=\"gatsby-highlight\" data-language=\"coffeescript\"><pre class=\"language-coffeescript\"><code class=\"language-coffeescript\">describe <span class=\"token string\">'Backbone * sinon.spy'</span><span class=\"token punctuation\">,</span> <span class=\"token operator\">-</span><span class=\"token operator\">></span> \n\tModel <span class=\"token operator\">=</span> Backbone<span class=\"token punctuation\">.</span>Model<span class=\"token punctuation\">.</span><span class=\"token keyword\">extend</span>\n\t\t<span class=\"token property\">defaults</span><span class=\"token operator\">:</span>\n\t\t\t<span class=\"token property\">name</span><span class=\"token operator\">:</span> <span class=\"token string\">'hoge'</span>\n\tView <span class=\"token operator\">=</span> Backbone<span class=\"token punctuation\">.</span>View<span class=\"token punctuation\">.</span><span class=\"token keyword\">extend</span>\n\t\t<span class=\"token property\">initialize</span><span class=\"token operator\">:</span> <span class=\"token operator\">-</span><span class=\"token operator\">></span> \n\t\t\t_<span class=\"token punctuation\">.</span>bindAll @<span class=\"token punctuation\">,</span> <span class=\"token string\">'render'</span>\n\t\t\t<span class=\"token class-member variable\">@model</span><span class=\"token punctuation\">.</span><span class=\"token keyword\">on</span> <span class=\"token string\">'change:name'</span><span class=\"token punctuation\">,</span> <span class=\"token class-member variable\">@render</span>\n\t\t<span class=\"token property\">render</span><span class=\"token operator\">:</span> <span class=\"token operator\">-</span><span class=\"token operator\">></span> \n\t\t\t@$el<span class=\"token punctuation\">.</span>html <span class=\"token class-member variable\">@model</span><span class=\"token punctuation\">.</span><span class=\"token function\">get</span><span class=\"token punctuation\">(</span><span class=\"token string\">'name'</span><span class=\"token punctuation\">)</span>\n\tbefore <span class=\"token operator\">-</span><span class=\"token operator\">></span> \n\t\t<span class=\"token class-member variable\">@view</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">View</span><span class=\"token punctuation\">(</span><span class=\"token property\">model</span><span class=\"token operator\">:</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Model</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n\t\t<span class=\"token class-member variable\">@spy</span> <span class=\"token operator\">=</span> sinon<span class=\"token punctuation\">.</span><span class=\"token function\">spy</span><span class=\"token punctuation\">(</span><span class=\"token class-member variable\">@view</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'render'</span><span class=\"token punctuation\">)</span>\n\tafter <span class=\"token operator\">-</span><span class=\"token operator\">></span> \n\t\t<span class=\"token class-member variable\">@spy</span><span class=\"token punctuation\">.</span><span class=\"token function\">restore</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n\tit <span class=\"token string\">'Modelモデルが変更された時View.renderが呼ばれる'</span><span class=\"token punctuation\">,</span> <span class=\"token operator\">-</span><span class=\"token operator\">></span> \n\t\t<span class=\"token class-member variable\">@view</span><span class=\"token punctuation\">.</span>model<span class=\"token punctuation\">.</span><span class=\"token function\">set</span><span class=\"token punctuation\">(</span><span class=\"token string\">'name'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'leko'</span><span class=\"token punctuation\">)</span> <span class=\"token function\">expect</span><span class=\"token punctuation\">(</span><span class=\"token class-member variable\">@spy</span><span class=\"token punctuation\">.</span>calledOnce<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>to<span class=\"token punctuation\">.</span>be<span class=\"token punctuation\">.</span><span class=\"token function\">ok</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span></code></pre></div>\n<p>実行してみると、通りません。。</p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 600px; \"\n    >\n      <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/cdd3cf50cdbfb81624319a349a2ca1dc/0a47e/mocha_ng.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n    <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 37.724550898203596%; position: relative; bottom: 0; left: 0; background-image: url('data:image/svg+xml,%3csvg%20xmlns=\\'http://www.w3.org/2000/svg\\'%20width=\\'400\\'%20height=\\'151\\'%20viewBox=\\'0%200%20400%20151\\'%20preserveAspectRatio=\\'none\\'%3e%3cpath%20d=\\'M6%209v4h44a3979%203979%200%200152-1l1-3c1-3%200-4-1-2h-2c-1-2-7-1-7%201h-1l-2-2-2%202c0%204%200%205-1%203h-2c-1%201-1%201-1-2V6H68v3c-1%203-1%203-1-1l-1-4v2h-1c-3-1-5%201-4%203v2l-5%201c-5%200-6%200-6-3l1-2-10-1-11-1c-1-1-1-1-3%201h-2c0-2-2-3-2-1l-5%201-5%201c-1%201-1%201-1-1s-1-2-3-2C6%204%206%204%206%209m128%209l-5%201h-9c-4%200-5%200-6%202v2l2-1h1c0%202%204%201%204-1h1c1%202%208%202%2010%200h1c0%202%203%203%203%201s0-2%203%200c3%201%205%200%205-3%200-2-5-2-8-1h-2m77%2033v2h13c11%200%2016-1%2010-2l-2-1h2c3%200%202-2-1-2-5%200-7%202-5%203v1l-2-2c0-2-1-2-7-2-8%200-8%200-8%203m58%206c-1%202-6%202-57%202l-56%201c0%202%201%202%2070%202%2041%200%2042%200%2043-2l2-2%201%202%202%201-1-3-2-1h-2m25%200v3c0%202%206%202%208%200s2-2%202%200c1%202%201%202%203%202h10l4-1v-2l2%202c1%202%202%201%202-1-1-3-3-3-6-2h-8l-7-1-2%201c-1%202-2%202-2%200-1-2-4-1-4%201l-1-1-1-1m0%2019l-69%201a3093%203093%200%2000-69%202c0%202%2011%202%2069%202h68l2-3%201-3-2%201M80%2077v2h7l1-1%201%201c-1%201%200%201%202%201l4-1h2v1c0%202%200%202%201%201l8-1%205-1%201-1%201%201c-1%201%200%201%201%201%203%200%205-2%203-3h-3c0-2-3-1-4%201h-1c0-2-27-3-29-1m232%208c-3%204%206%206%209%202h1c0%202%201%202%208%202l4-1h2c1%202%204%201%204-1-1-2-3-2-12-2h-6c-1-1-1%200-2%201l-1%202-2-2-2-2-1%202v3l-1-3c0-2-1-2-1-1m-36%2010l-37%201a153%20153%200%2000-37%201%20141%20141%200%2000-40%200h-1l-2%201-2-1-11-1h-11l-2%202h3a3395%203395%200%2000141-1h2l2%202v-1l-1-2c1-2-3-2-4-1m-36%2019c-1%202-1%202-2%201a2015%202015%200%2000-111%202l19%201%2018-1h3l36%201c34%200%2036-1%2038-2%201-2%201-2%202-1%200%203%202%202%202%200%200-3-4-3-5-1m25-1c-3%204%206%206%209%202h1c0%202%2011%203%2012%201h1l3%201c1%200%202%200%202-2-1-1-3-2-7-2h-11c-1-1-2%200-3%201l-1%201-2-2c-2-1-2-1-2%201s0%202-1%200c0-2-1-2-1-1m-25%2019l-70%201c-4-1-4%203%200%203a141%20141%200%200033-1c1%201%2017%202%2029%201%207%200%208-1%209-2l1-2v2c1%203%203%203%203%200-1-2-5-4-5-2m-113%203c0%201-1%201%2022%201%2013%201%2015%200%2015-1h2c0-2-2-2-19-2s-20%200-20%202\\'%20fill=\\'%23d3d3d3\\'%20fill-rule=\\'evenodd\\'/%3e%3c/svg%3e'); background-size: cover; display: block;\"\n  ></span>\n  <picture>\n          <source\n              srcset=\"/static/cdd3cf50cdbfb81624319a349a2ca1dc/5251b/mocha_ng.webp 167w,\n/static/cdd3cf50cdbfb81624319a349a2ca1dc/7390e/mocha_ng.webp 334w,\n/static/cdd3cf50cdbfb81624319a349a2ca1dc/e88ff/mocha_ng.webp 600w\"\n              sizes=\"(max-width: 600px) 100vw, 600px\"\n              type=\"image/webp\"\n            />\n          <source\n            srcset=\"/static/cdd3cf50cdbfb81624319a349a2ca1dc/21521/mocha_ng.png 167w,\n/static/cdd3cf50cdbfb81624319a349a2ca1dc/86d36/mocha_ng.png 334w,\n/static/cdd3cf50cdbfb81624319a349a2ca1dc/0a47e/mocha_ng.png 600w\"\n            sizes=\"(max-width: 600px) 100vw, 600px\"\n            type=\"image/png\"\n          />\n          <img\n            class=\"gatsby-resp-image-image\"\n            src=\"/static/cdd3cf50cdbfb81624319a349a2ca1dc/0a47e/mocha_ng.png\"\n            alt=\"Moch\"\n            title=\"Moch\"\n            loading=\"lazy\"\n            decoding=\"async\"\n            style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n          />\n        </picture>\n  </a>\n    </span></p>\n<p>Backboneを理解されてる方なら<br>\n「初心者乙」<br>\nで終わってしまうのかもしれませんが、Backbone初心者だから仕方ない。</p>\n<p>先ほどの例のように、</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\">spy <span class=\"token operator\">=</span> sinon<span class=\"token punctuation\">.</span><span class=\"token function\">spy</span><span class=\"token punctuation\">(</span>view<span class=\"token punctuation\">,</span> <span class=\"token string\">'render'</span><span class=\"token punctuation\">)</span></code></pre></div>\n<p>と指定したので、<br>\nview.renderが呼ばれたらspy.calledOnceはtrueになるはず。<br>\nconsole.logなどを挟んで関数が呼ばれているか試したところ、呼ばれていました。 しかし、spy上では呼ばれたことになっていません。ここで詰まりました。</p>\n<h2 id=\"解決策\" style=\"position:relative;\"><a href=\"#%E8%A7%A3%E6%B1%BA%E7%AD%96\" aria-label=\"解決策 permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>解決策</h2>\n<p>なるべく英語は読みたくない（読めない）ので、 日本語の記事が無いか探してみたんですが、無さそうでした。</p>\n<p>英語記事を漁っていると、StackOverFlowに<br>\n似た悩みを抱えた質問と解答が寄せられていました。</p>\n<blockquote>\n<p><a href=\"http://stackoverflow.com/questions/9623986/backbone-js-view-tests-using-sinon-spies-in-a-browser\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">javascript – Backbone.js view tests using Sinon Spies in a browser – Stack Overflow</a></p>\n</blockquote>\n<p>結論を先に書くと、先ほどのコード、惜しい感じでした。</p>\n<p>間違っていたのは、spyの設定の仕方でした。</p>\n<div class=\"gatsby-highlight\" data-language=\"coffeescript\"><pre class=\"language-coffeescript\"><code class=\"language-coffeescript\"><span class=\"token comment\"># 間違い</span>\nbefore <span class=\"token operator\">-</span><span class=\"token operator\">></span>\n\t<span class=\"token class-member variable\">@view</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">View</span><span class=\"token punctuation\">(</span> <span class=\"token property\">model</span><span class=\"token operator\">:</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Model</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">)</span>\n\t<span class=\"token class-member variable\">@spy</span> <span class=\"token operator\">=</span> sinon<span class=\"token punctuation\">.</span><span class=\"token function\">spy</span><span class=\"token punctuation\">(</span> <span class=\"token class-member variable\">@view</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'render'</span> <span class=\"token punctuation\">)</span>\n<span class=\"token comment\"># 合ってる</span>\nbefore <span class=\"token operator\">-</span><span class=\"token operator\">></span>\n\t<span class=\"token class-member variable\">@spy</span> <span class=\"token operator\">=</span> sinon<span class=\"token punctuation\">.</span><span class=\"token function\">spy</span><span class=\"token punctuation\">(</span> <span class=\"token class-name\">View</span><span class=\"token punctuation\">.</span>prototype<span class=\"token punctuation\">,</span> <span class=\"token string\">'render'</span> <span class=\"token punctuation\">)</span>\n\t<span class=\"token class-member variable\">@view</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">View</span><span class=\"token punctuation\">(</span> <span class=\"token property\">model</span><span class=\"token operator\">:</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Model</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">)</span></code></pre></div>\n<p>実行してみると、通ります。</p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 380px; \"\n    >\n      <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/3b3a85c690632a8266e6865a1b4e678a/3f520/mocha_ok.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n    <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 14.970059880239523%; position: relative; bottom: 0; left: 0; background-image: url('data:image/svg+xml,%3csvg%20xmlns=\\'http://www.w3.org/2000/svg\\'%20width=\\'400\\'%20height=\\'59\\'%20viewBox=\\'0%200%20400%2059\\'%20preserveAspectRatio=\\'none\\'%3e%3cpath%20d=\\'M10%2017v8h4l7-2h3c0%202%201%202%205%202h4l-1-5-1-6c0-2-6-1-7%201%200%202%201%203%202%201%201-1%204-1%204%201l-2%201-4%201c-1%201-3-2-2-5s-2-5-8-5h-4v8m45%200v8h4c4%200%207-2%207-4l1%201c3%205%2010%203%2010-3s-7-8-10-3c-1%202-1%202-1%200-1-2-5-4-7-3s-2%200-2-2l-1-2-1%208m36-2l-1%204c0%208%209%208%2010%201%200-6-6-9-9-5m57%200c-5%206%202%2014%207%208%202-2%202-6%200-8-2-3-6-2-7%200m39%206c0%206%200%208%201%207l1-2c-1-2%200-2%202-1%204%200%206-1%206-6v-4l2%204c2%205%202%207%200%208l-1%202c2%201%204-2%207-8%202-7%202-11-1-4l-2%204-1-4c-2-4-4-5-4-3h-1l-5-1-4%201v7M44%2041v5c1%201%201%200%201-2v-3l2%203%201%204%202-4c1-4%202-4%201-1l1%203c1%201%201%200%201-1h1c1%202%205%203%206%200h1l3%202c3%200%203%200%203-5%200-3%200-5-1-4l-1%201-3%202h-3c-2-3-4-2-5%200l-1-1c-1-3-2-3-4%201l-1%204-1-3-1-4c0-3-2%200-2%203\\'%20fill=\\'%23d3d3d3\\'%20fill-rule=\\'evenodd\\'/%3e%3c/svg%3e'); background-size: cover; display: block;\"\n  ></span>\n  <picture>\n          <source\n              srcset=\"/static/3b3a85c690632a8266e6865a1b4e678a/5251b/mocha_ok.webp 167w,\n/static/3b3a85c690632a8266e6865a1b4e678a/7390e/mocha_ok.webp 334w,\n/static/3b3a85c690632a8266e6865a1b4e678a/1cdb2/mocha_ok.webp 380w\"\n              sizes=\"(max-width: 380px) 100vw, 380px\"\n              type=\"image/webp\"\n            />\n          <source\n            srcset=\"/static/3b3a85c690632a8266e6865a1b4e678a/21521/mocha_ok.png 167w,\n/static/3b3a85c690632a8266e6865a1b4e678a/86d36/mocha_ok.png 334w,\n/static/3b3a85c690632a8266e6865a1b4e678a/3f520/mocha_ok.png 380w\"\n            sizes=\"(max-width: 380px) 100vw, 380px\"\n            type=\"image/png\"\n          />\n          <img\n            class=\"gatsby-resp-image-image\"\n            src=\"/static/3b3a85c690632a8266e6865a1b4e678a/3f520/mocha_ok.png\"\n            alt=\"Moch\"\n            title=\"Moch\"\n            loading=\"lazy\"\n            decoding=\"async\"\n            style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n          />\n        </picture>\n  </a>\n    </span></p>\n<p>このように、インスタンス化したオブジェクトにspyを忍び込ませるのではなく、<br>\n<strong>コンストラクタ関数のprototypeにspyを設定して、<br>\nその後にインスタンスを生成するとうまく動くようです。</strong></p>","timeToRead":4,"frontmatter":{"title":"Backbone.js×sinon.jsのテストでspyが上手く動かない時のメモ","tags":["Backbone.js","JavaScript","Mocha","sinon.js"],"date":"March 22, 2013","featuredImage":{"childImageSharp":{"fluid":{"tracedSVG":"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='400'%20height='144'%20viewBox='0%200%20400%20144'%20preserveAspectRatio='none'%3e%3cpath%20d='M333%2027c9%205%209%207%201%2012s-8%207%200%2011l5%205c1%202-1%2010-3%2010-1%201-1%201%201%201%203%200%2012-9%2012-12s-2-5-6-6c-8-2-6-5%205-9%2018-6%2012-13-10-14h-10l5%202m-31%2013l-6%204c-3%201-3%201-2%206%202%203%203%204%204%201%200-2%206-6%208-6%203%200%206%205%209%2018%203%2014%208%2027%2011%2030%202%203%200%202-6-1-5-2-5-2-4-5%206-21-23-31-35-11-8%2012%200%2027%2013%2027%204%200%2014-4%2015-6l16%2010%2015%2011h2c2%202%206%201%208-2%202-4%201-8-6-11l-5-3%203-1c6-2%209-7%209-16s-5-19-9-19v1l2%202h-2c-3-2-6-2-9-1-2%202-4%202-2%200%201-1%201-1-1-1-1%201-2%200-5-6-9-24-12-26-23-21M36%2072v19l7-3c8-6%208-6%2016-1l8%204V53l-7%204c-8%205-8%205-16%200l-8-4v19m44%200v11h5c8%200%2012-5%207-10v-3c5-4%200-9-7-9h-5v11m20%200l-4%2011%203-4c1-4%201-4%206-4%204%200%204%200%205%203%202%205%202%206%203%204l-8-21-5%2011m51-10v11l1%2010h3c6%200%2010-2%2010-5%201-2%200-6-2-6v-2c3-2%202-6%200-7-3-2-11-3-12-1m22%200c-3%202-4%206-4%2010%200%2010%209%2015%2016%208%204-4%204-13%200-17-3-2-9-3-12-1m19%2010c0%2013%202%2015%202%202l1-9%205%209%207%209%201-11c0-13-1-14-2-2v9l-6-8-7-10-1%2011m-19-8c-6%206-2%2019%206%2018%205-1%207-4%207-10%200-9-7-13-13-8m121%208c-7%204-12%2013-11%2019%203%207%2010%208%2018%203%2016-11%209-31-7-22m1%201c-5%202-6%204-2%203%202%200%202%200%201%202-3%204-2%204%201%202s4-2%201%202c-2%202%200%203%203%200%202-3%203-2%201%202-2%203-1%204%202%201%202-3%203-2%202%201-2%204-1%203%202-1%204-5%204-4-1-10-4-5-4-5-10-2m36%206a8882%208882%200%20010%203v1c1%203%200%208-2%208-2%201-2%201%201%203%204%203%208%204%2010%201%202-1%202-1%200-1-3%200-4-2-1-2%203-1%202-3-1-3l-2-1%202-2%203-1-3-1-2-2%203-1%203-1-3-2c-5-1-8-1-8%201m-16%2015c-2%201-1%202%201%201l2%202c1%202%201%202%202%201%201-2%202-1%203%202%200%203%200%203%202%202%201-3%201-3%203%202%201%202%201%202%202%201%201-2%201-2%202%201%202%203%202%203%203%202%200-2%201-2%202%201l2%204%201-3%202-4-13-6c-12-7-13-7-14-6'%20fill='%23d3d3d3'%20fill-rule='evenodd'/%3e%3c/svg%3e","aspectRatio":2.783333333333333,"src":"/static/0d5dd3302cf63e575062d76b12d9ea32/2db26/featured-image.jpg","srcSet":"/static/0d5dd3302cf63e575062d76b12d9ea32/466a3/featured-image.jpg 334w,\n/static/0d5dd3302cf63e575062d76b12d9ea32/2db26/featured-image.jpg 549w","srcWebp":"/static/0d5dd3302cf63e575062d76b12d9ea32/f142c/featured-image.webp","srcSetWebp":"/static/0d5dd3302cf63e575062d76b12d9ea32/cd98f/featured-image.webp 334w,\n/static/0d5dd3302cf63e575062d76b12d9ea32/f142c/featured-image.webp 549w","sizes":"(max-width: 549px) 100vw, 549px"}}}}}},"pageContext":{"slug":"/test-backbone-with-sinon/","previous":{"fields":{"slug":"/how-to-customize-embeded-timeline-of-twitter/"},"frontmatter":{"title":"Twitterの埋め込みタイムラインを設置してカスタマイズしてみた","tags":["Twitter"]}},"next":{"fields":{"slug":"/automated-build-ios-anndroid-with-titanium/"},"frontmatter":{"title":"titanium-cliとGruntを使って、コマンドラインからiOS・Androidアプリのビルドを自動化する方法(前編)","tags":["Android","iOS","JavaScript","Titanium studio"]}}}},
    "staticQueryHashes": ["2585454260","2954598359"]}