{"id":13209,"date":"2021-02-11T19:08:56","date_gmt":"2021-02-11T10:08:56","guid":{"rendered":"http:\/\/www.code-magagine.com\/?p=13209"},"modified":"2023-09-27T22:41:34","modified_gmt":"2023-09-27T13:41:34","slug":"%e3%80%90react%e3%80%91%e3%80%8capi%e3%80%8d%e3%81%ae%e5%ae%9f%e8%a1%8c%e3%82%92%e3%83%86%e3%82%b9%e3%83%88%e3%81%97%e3%81%9f%e3%81%84%e5%a0%b4%e5%90%88","status":"publish","type":"post","link":"http:\/\/www.code-magagine.com\/?p=13209","title":{"rendered":"\u3010React\u3011\u300cAPI\u300d\u306e\u5b9f\u884c\u3092\u30c6\u30b9\u30c8\u3057\u305f\u3044\u5834\u5408\uff08\u76f4\u63a5\u547c\u3076\u3001axios\u306ejest\u30e2\u30c3\u30af\u3001msw\u3092\u4f7f\u3046\u3002\uff09"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">API\u3092\u76f4\u63a5\u547c\u3076\u5834\u5408<\/h2>\n\n\n\n<p>\u4f8b\u3048\u3070\u3001Render\u3068\u3044\u3046\u30b3\u30f3\u30dd\u30fc\u30cd\u30f3\u30c8\u304c\u521d\u671f\u8868\u793a\u6642\u306bUseEffect\u3092\u4f7f\u7528\u3057\u3066API\u3067\u8868\u793a\u3059\u308b\u30c7\u30fc\u30bf\u3092\u53d6\u5f97\u3059\u308b\u51e6\u7406\u304c\u3042\u3063\u305f\u5834\u5408\u306f\u4e0b\u8a18\u306e\u3088\u3046\u306a\u30c6\u30b9\u30c8\u3092\u66f8\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">import React from \"react\";\nimport { render, screen } from \"@testing-library\/react\";\nimport Render from \".\/Render\";\n\ndescribe(\"API\", () =&gt; {\n  it(\"API\u30c6\u30b9\u30c8\", async () =&gt; {\n    render(&lt;Render \/&gt;);\n    expect(screen.queryByText(\/\u30c6\u30b9\u30c8\/)).toBeNull(); \/\/API\u306e\u7d50\u679c\u304c\u53d6\u5f97\u3055\u308c\u306a\u3044\u3053\u3068\u3002\n    expect(await screen.findByText(\/\u30c6\u30b9\u30c8\/)).toBeInTheDocument(); \/\/API\u306e\u7d50\u679c\u304c\u53d6\u5f97\u3055\u308c\u308b\u3053\u3068\u3002\n  });\n});\n<\/pre>\n\n\n\n<p>await\u3092\u3059\u308b\u5834\u5408\u306fAPI\u306e\u5b9f\u884c\u7d50\u679c\u3092\u5f85\u3064\u306e\u3067\u30c7\u30fc\u30bf\u304c\u8868\u793a\u3055\u308c\u308b\u3053\u3068\u3092\u30c1\u30a7\u30c3\u30af\u3057\u3001await\u3092\u3057\u306a\u3044\u5834\u5408\u306fAPI\u306e\u7d50\u679c\u3092\u5f85\u305f\u306a\u3044\u306e\u3067\u30c7\u30fc\u30bf\u304c\u8868\u793a\u3055\u308c\u306a\u3044\u3068\u3044\u3046\u3088\u3046\u306a\u30c6\u30b9\u30c8\u30b1\u30fc\u30b9\u3092\u4f5c\u308b\u3053\u3068\u306b\u306a\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">jest.mock(\"axios\")\u3092\u4f7f\u3063\u3066\u30e2\u30c3\u30af\u5316\u3059\u308b\u3002\uff08\u6700\u8fd1\u306f\u975e\u63a8\u5968\uff09<\/h2>\n\n\n\n<p>axios\u3092\u30e2\u30c3\u30af\u5316\u3059\u308b\u5834\u5408\u306f\u4ee5\u4e0b\u306e\u3088\u3046\u306b\u8a18\u8ff0\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import {render,screen} from \"@testing-library\/react\";\r\nimport userEvent from \"@testing-library\/user-event\";\r\nimport axios from \"axios\";\r\nimport {Render} from \".\/Render\"\r\n\r\nconst user = userEvent.setup();\r\n\r\njest.mock(\"axios\");\r\nconst mockAxios = jest.mocked(axios);\r\ndescribe(\"axios mock\",()=>{\r\n    beforeEach(()=>{\r\n        mockAxios.get.mockReset();\r\n    });\r\n\r\n    it(\"\u5165\u529b\u30d5\u30a9\u30fc\u30e0\u306b\u5165\u529b\u3057\u305f\u5185\u5bb9\u3067API\u30ea\u30af\u30a8\u30b9\u30c8\u304c\u9001\u4fe1\u3055\u308c\u308b\",async ()=>{\r\n        const userInfo = {\r\n            id:1,\r\n            name: \"Taro\"\r\n        };\r\n        const resp = { data: userInfo };\r\n        mockAxios.get.mockResolvedValue(resp);\r\n\r\n        render(&lt;Render \/>)\r\n\r\n        const input = screen.getByRole(\"textbox\");\r\n        await user.type(input,userInfo.name);\r\n        const button = screen.getByRole(\"button\");\r\n        await user.click(button);\r\n        \/\/ \u30b3\u30f3\u30dd\u30fc\u30cd\u30f3\u30c8\u5074\u3067\u300c\/api\/users?query=\"\u30e6\u30fc\u30b6\u30fc\u540d\"\u300d\u3068\u3044\u3046API\u3092axios\u3067\u53e9\u3044\u3066\u3044\u308b\u3002\n        expect(mockAxios.get).toHaveBeenCalledWith(`\/api\/users?query=${userInfo.name}`)\r\n    })\r\n})<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">mock service worker\u3092\u4f7f\u3063\u3066\u30e2\u30c3\u30af\u3092\u4f7f\u3046\u5834\u5408\uff08\u6700\u8fd1\u306f\u63a8\u5968\uff09<\/h2>\n\n\n\n<p>mock service worker\u3068\u3044\u3046\u7269\u3092\u4f7f\u3046\u3053\u3068\u304c\u516c\u5f0f\u3067\u63a8\u5968\u3055\u308c\u3066\u3044\u307e\u3059\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">axios\u306e\u30e2\u30c3\u30af\u306e\u554f\u984c\u70b9<\/h3>\n\n\n\n<p>\u4e00\u8a00\u3067\u3044\u3048\u3070\u3001axios\u81ea\u4f53\u3092mock\u5316\u3057\u3066\u3044\u308b\u306e\u3067axios\u3068\u306e\u4f9d\u5b58\u95a2\u4fc2\u304c\u306a\u304f\u306a\u3063\u3066\u3057\u307e\u3046\u3002<\/p>\n\n\n\n<ul>\n<li>axios\u3092\u305d\u306e\u307e\u307emock\u3057\u3066\u3044\u308b\u306e\u3067axios\u306e\u30e2\u30b8\u30e5\u30fc\u30eb\u81ea\u4f53\u306b\u30d0\u30b0\u304c\u5165\u3063\u305f\u5834\u5408\u3067\u3082\u52d5\u3044\u3066\u3057\u307e\u3046\u3002<\/li>\n\n\n\n<li>axios\u306e\u30e9\u30a4\u30d6\u30e9\u30ea\u81ea\u4f53\u304c\u5909\u308f\u3063\u3066\u3057\u307e\u3044\u623b\u308a\u5024\u304c\u5909\u308f\u3063\u305f\u5834\u5408\u3067\u3082\u52d5\u3044\u3066\u3057\u307e\u3046\u3002<\/li>\n<\/ul>\n\n\n\n<p>msw\u3092\u4f7f\u3048\u3070axios\u81ea\u4f53\u3092\u30e2\u30c3\u30af\u305b\u305a\u3001axios\u3068\u901a\u4fe1\u3092msw\u304c\u30a4\u30f3\u30bf\u30fc\u30bb\u30d7\u30c8\u3057\u3066\u30e2\u30c3\u30af\u5024\u3092\u8fd4\u3057\u307e\u3059\u3002\u306a\u306e\u3067\u3001\u30e2\u30c3\u30af\u5316\u3055\u308c\u3066\u3044\u306a\u3044axios\u3068\u901a\u4fe1\u3059\u308b\u3053\u3068\u306b\u306a\u308b\u306e\u3067\u4e0a\u8a18\u306e\u554f\u984c\u3092\u89e3\u6d88\u3067\u304d\u308b\u3068\u306e\u3053\u3068\u3067\u3059\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb<\/h3>\n\n\n\n<pre class=\"wp-block-preformatted\">npm install msw --save-dev<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\u5b9f\u88c5<\/h3>\n\n\n\n<p>\u4f8b\u3048\u3070\u3001GET\u30ea\u30af\u30a8\u30b9\u30c8\u3067\u3042\u308c\u3070\u4e0b\u8a18\u306e\u3088\u3046\u306a\u611f\u3058\u306b\u306a\u308a\u307e\u3059\u3002API\u306e\u30a8\u30f3\u30c9\u30dd\u30a4\u30f3\u30c8\u3092\u6307\u5b9a\u3059\u308c\u3070\u5916\u90e8\u306eAPI\u3067\u306f\u306a\u304f\u3053\u3061\u3089\u306e\u30e2\u30c3\u30af\u306e\u5185\u5bb9\u3092\u8fd4\u3057\u3066\u304f\u308c\u307e\u3059\u3002\u4e0b\u8a18\u306e\u30bb\u30c3\u30c8\u30a2\u30c3\u30d7\u3092\u3059\u308c\u3070\u3001\u30c6\u30b9\u30c8\u5bfe\u8c61\u306e\u30b3\u30f3\u30dd\u30fc\u30cd\u30f3\u30c8\u5185\u3067API\u30a8\u30f3\u30c9\u30dd\u30a4\u30f3\u30c8\u306b\u30a2\u30af\u30bb\u30b9\u3059\u308c\u3070\u30e2\u30c3\u30af\u30b5\u30fc\u30d0\u30fc\u304c\u7d50\u679c\u3092\u8fd4\u3057\u3066\u304f\u308c\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import { render, screen, cleanup } from \"@testing-library\/react\";\nimport { rest } from \"msw\";\nimport { setupServer } from \"msw\/node\";\n\nconst server = setupServer(\n  rest.get(\"API\u306e\u30a8\u30f3\u30c9\u30dd\u30a4\u30f3\u30c8\u306eURL\", (req, res, ctx) =&gt; {\n    return res(ctx.status(200), ctx.json({ name:\"\u592a\u90ce\" }));\n  })\n);\n\nbeforeAll(() =&gt; server.listen());\nafterEach(() =&gt; {\n  server.resetHandlers();\n  cleanup();\n});\nafterAll(() =&gt; server.close());<\/code><\/pre>\n\n\n\n<p>\u30ea\u30af\u30a8\u30b9\u30c8\u306e\u3053\u3068\u3067\u3001\u30ea\u30af\u30a8\u30b9\u30c8\u30d1\u30e9\u30e1\u30fc\u30bf\u3092\u8ffd\u52a0\u3057\u305f\u3044\u5834\u5408\u3068\u304b\u306b\u4f7f\u3063\u305f\u308a\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">res<\/h4>\n\n\n\n<p>\u4e0a\u306e\u4f8b\u3067\u8a00\u3048\u3070GET\u306b\u5bfe\u3059\u308b\u30ec\u30b9\u30dd\u30f3\u30b9\u306e\u3053\u3068\u3067\u3059\u3002<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">ctx<\/h4>\n\n\n\n<p>\u30b3\u30f3\u30c6\u30ad\u30b9\u30c8\u306e\u3053\u3068\u3067\u3059\u3002json\u306a\u3069\u30ec\u30b9\u30dd\u30f3\u30b9\u306e\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u306e\u30c0\u30df\u30fc\u306e\u5185\u5bb9\u3092\u5b9a\u7fa9\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">beforeAll(() =&gt; server.listen());<\/h4>\n\n\n\n<p>\u5168\u3066\u306e\u30c6\u30b9\u30c8\u30b3\u30fc\u30c9\u5b9f\u884c\u524d\u306b\u30e2\u30c3\u30af\u30b5\u30fc\u30d0\u30fc\u3092\u8d77\u52d5\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">server.resetHandlers();<\/h4>\n\n\n\n<p>\u30b5\u30fc\u30d0\u30fc\u3092\u4e00\u65e6\u30ea\u30bb\u30c3\u30c8\u3057\u307e\u3059\u3002\u5404\u30c6\u30b9\u30c8\u30b3\u30fc\u30c9\u304c\u7d42\u308f\u308b\u5ea6\u306b\u3053\u308c\u3092\u547c\u3076\u6c7a\u307e\u308a\u306b\u306a\u3063\u3066\u3044\u308b\u306e\u3067\u3001afterEach\u3068\u4e00\u7dd2\u306b\u8a18\u8ff0\u3059\u308b\u3053\u3068\u304c\u5b9a\u4f8b\u306b\u306a\u3063\u3066\u3044\u307e\u3059\u3002\u5404\u30c6\u30b9\u30c8\u30b1\u30fc\u30b9\u9593\u3067\u526f\u4f5c\u7528\u304c\u8d77\u3053\u3089\u306a\u3044\u3088\u3046\u306b\u3059\u308b\u305f\u3081\u306e\u8a18\u8ff0\u3067\u3059\u3002<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">afterAll(() =&gt; server.close());<\/h4>\n\n\n\n<p>\u5168\u3066\u306e\u30c6\u30b9\u30c8\u30b3\u30fc\u30c9\u5b9f\u884c\u5f8c\u306b\u30e2\u30c3\u30af\u30b5\u30fc\u30d0\u30fc\u3092\u7d42\u4e86\u3057\u307e\u3059\u3002\u5404\u30c6\u30b9\u30c8\u30b1\u30fc\u30b9\u9593\u3067\u526f\u4f5c\u7528\u304c\u8d77\u3053\u3089\u306a\u3044\u3088\u3046\u306b\u3059\u308b\u305f\u3081\u306e\u8a18\u8ff0\u3067\u3059\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u8907\u6570\u306eAPI\u30a8\u30f3\u30c9\u30dd\u30a4\u30f3\u30c8\u3092\u5b9a\u7fa9\u3057\u305f\u3044\u5834\u5408<\/h3>\n\n\n\n<p>\u4ee5\u4e0b\u306e\u3088\u3046\u306bsetupServer\u306b\u5bfe\u3057\u3066<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">const handlers = [\n  rest.post('\u30a8\u30f3\u30c9\u30dd\u30a4\u30f3\u30c8URL1', (req, res, ctx) =&gt; {\n    return res(ctx.status(200), ctx.json({ token: 'abc123' }));\n  }),\n  rest.post('\u30a8\u30f3\u30c9\u30dd\u30a4\u30f3\u30c8URL2', (req, res, ctx) =&gt; {\n    return res(ctx.status(201));\n  }),\n];\n\nconst server = setupServer(...handlers);<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\u3042\u308b\u30c6\u30b9\u30c8\u30b1\u30fc\u30b9\u3060\u3051\u30a8\u30f3\u30c9\u30dd\u30a4\u30f3\u30c8\u306e\u30ec\u30b9\u30dd\u30f3\u30b9\u7d50\u679c\u3092\u5909\u3048\u305f\u3044\u5834\u5408<\/h3>\n\n\n\n<pre class=\"wp-block-preformatted\">  it('\u3042\u308b\u30a8\u30f3\u30c9\u30dd\u30a4\u30f3\u30c8\u3060\u3051\u5909\u3048\u308b', async () =&gt; {\n    server.use(\n      rest.post('http:\/\/localhost:8000\/api\/auth\/', (req, res, ctx) =&gt; {\n        return res(ctx.status(400));\n      })\n    );\n    render(\n        &lt;xxx\/&gt;\n    );\n\u3000\u3000\u3000\u3000\u3000\u3000\u51e6\u7406\n  });<\/pre>\n\n\n\n<p>it\u306e\u4e2d\u3067\u3001<span style=\"color: #ff0000;\"><strong>server.use<\/strong><\/span>\u3092\u4f7f\u3044\u307e\u3059\u3002\u305d\u3046\u3059\u308b\u3053\u3068\u3067<span style=\"color: #ff0000;\"><strong>\u7279\u5b9a\u306eit\u5185\u3067\u306e\u307f\u7279\u5b9a\u306e\u30a8\u30f3\u30c9\u30dd\u30a4\u30f3\u30c8\u306e\u8fd4\u3059\u7d50\u679c\u3092\u5909\u3048\u308b\u3053\u3068<\/strong><\/span>\u304c\u53ef\u80fd\u3067\u3059\u3002<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">\u7528\u9014<\/h4>\n\n\n\n<p>\u3042\u308b\u30c6\u30b9\u30c8\u30b1\u30fc\u30b9\u3060\u3051\u610f\u56f3\u7684\u306b\u51e6\u7406\u3092\u5931\u6557\u3055\u305b\u305f\u3044\u5834\u5408\u306a\u3069\u306b\u4f7f\u3048\u305f\u308a\u3057\u307e\u3059\u3002<\/p>\n","protected":false},"excerpt":{"rendered":"API\u3092\u76f4\u63a5\u547c\u3076\u5834\u5408 \u4f8b\u3048\u3070\u3001Render\u3068\u3044\u3046\u30b3\u30f3\u30dd\u30fc\u30cd\u30f3\u30c8\u304c\u521d\u671f\u8868\u793a\u6642\u306bUseEffect\u3092\u4f7f\u7528\u3057\u3066API\u3067\u8868\u793a\u3059\u308b\u30c7\u30fc\u30bf\u3092\u53d6\u5f97\u3059\u308b\u51e6\u7406\u304c\u3042\u3063\u305f\u5834\u5408\u306f\u4e0b\u8a18\u306e\u3088\u3046\u306a\u30c6\u30b9\u30c8\u3092\u66f8\u304d\u307e\u3059\u3002 import React from [&hellip;]","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[116],"tags":[],"_links":{"self":[{"href":"http:\/\/www.code-magagine.com\/index.php?rest_route=\/wp\/v2\/posts\/13209"}],"collection":[{"href":"http:\/\/www.code-magagine.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.code-magagine.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.code-magagine.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.code-magagine.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=13209"}],"version-history":[{"count":11,"href":"http:\/\/www.code-magagine.com\/index.php?rest_route=\/wp\/v2\/posts\/13209\/revisions"}],"predecessor-version":[{"id":23253,"href":"http:\/\/www.code-magagine.com\/index.php?rest_route=\/wp\/v2\/posts\/13209\/revisions\/23253"}],"wp:attachment":[{"href":"http:\/\/www.code-magagine.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=13209"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.code-magagine.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=13209"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.code-magagine.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=13209"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}