{"provider_url":"https://hatena.blog","url":"https://blog.nnn.dev/entry/2026/04/01/110000","width":"100%","description":"\u76ee\u6b21 \u306f\u3058\u3081\u306b 1. RuboCop\u306e\u30ef\u30fc\u30cb\u30f3\u30b0\u3068\u5bfe\u7b56 1.1 \u5b9a\u7fa9\u6570\u304c\u591a\u3059\u304e\u308b\u554f\u984c\uff08RSpec/MultipleMemoizedHelpers\uff09 \u5bfe\u7b561: \u5171\u901a\u30bb\u30c3\u30c8\u30a2\u30c3\u30d7\u3092\u5207\u308a\u51fa\u3059\u3001shared_context \u3092\u6d3b\u7528\u3059\u308b \u5bfe\u7b562: before \u30d6\u30ed\u30c3\u30af\u3068\u5909\u6570\u3092\u4f7f\u3046 \u5bfe\u7b563: \u95a2\u9023\u3059\u308b\u30d1\u30e9\u30e1\u30fc\u30bf\u3092\u30cf\u30c3\u30b7\u30e5\u306b\u307e\u3068\u3081\u308b \u5bfe\u7b564: FactoryBot \u306e trait \u3092\u6d3b\u7528\u3059\u308b \u5bfe\u7b56\u306e\u4f7f\u3044\u5206\u3051 1.2 expect(receive) \u3068 have_received \u306e\u9055\u3044\uff08RSpec/MessageSpies\uff09 receive \u3068 have_received \u306e\u6839\u672c\u7684\u306a\u9055\u3044 double /\u2026","published":"2026-04-01 11:00:00","author_url":"https://blog.hatena.ne.jp/ryuki494/","type":"rich","author_name":"ryuki494","categories":["\u30d0\u30c3\u30af\u30a8\u30f3\u30c9"],"image_url":"https://cdn-ak.f.st-hatena.com/images/fotolife/r/ryuki494/20260317/20260317110916.png","provider_name":"Hatena Blog","title":"\u65b0\u5352\u30a8\u30f3\u30b8\u30cb\u30a2\u4f53\u9a13\uff1aRSpec\u3067\u906d\u9047\u3057\u305f\u7f60\u3068\u5bfe\u7b56","blog_url":"https://blog.nnn.dev/","blog_title":"\u30c9\u30ef\u30f3\u30b4\u6559\u80b2\u30b5\u30fc\u30d3\u30b9\u958b\u767a\u8005\u30d6\u30ed\u30b0","height":"190","html":"<iframe src=\"https://hatenablog-parts.com/embed?url=https%3A%2F%2Fblog.nnn.dev%2Fentry%2F2026%2F04%2F01%2F110000\" title=\"\u65b0\u5352\u30a8\u30f3\u30b8\u30cb\u30a2\u4f53\u9a13\uff1aRSpec\u3067\u906d\u9047\u3057\u305f\u7f60\u3068\u5bfe\u7b56 - \u30c9\u30ef\u30f3\u30b4\u6559\u80b2\u30b5\u30fc\u30d3\u30b9\u958b\u767a\u8005\u30d6\u30ed\u30b0\" class=\"embed-card embed-blogcard\" scrolling=\"no\" frameborder=\"0\" style=\"display: block; width: 100%; height: 190px; max-width: 500px; margin: 10px 0px;\"></iframe>","version":"1.0"}