{"id":1423,"date":"2025-02-15T11:30:46","date_gmt":"2025-02-15T02:30:46","guid":{"rendered":"https:\/\/daba-no-heya.com\/?p=1423"},"modified":"2025-02-15T18:02:02","modified_gmt":"2025-02-15T09:02:02","slug":"post-1423","status":"publish","type":"post","link":"https:\/\/daba-no-heya.com\/?p=1423","title":{"rendered":"\u3010Python\u3011MagicMock\u3092\u4f7f\u3063\u3066\u307f\u308b"},"content":{"rendered":"\n<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_82_2 counter-hierarchy ez-toc-counter ez-toc-grey ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">Table of Contents<\/p>\n<span class=\"ez-toc-title-toggle\"><a href=\"#\" class=\"ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle\" aria-label=\"Toggle Table of Content\"><span class=\"ez-toc-js-icon-con\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/span><\/a><\/span><\/div>\n<nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/daba-no-heya.com\/?p=1423\/#%E6%A6%82%E8%A6%81\" >\u6982\u8981<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/daba-no-heya.com\/?p=1423\/#%E4%BE%8B1\" >\u4f8b1<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/daba-no-heya.com\/?p=1423\/#%E4%BE%8B2\" >\u4f8b2<\/a><\/li><\/ul><\/nav><\/div>\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"%E6%A6%82%E8%A6%81\"><\/span>\u6982\u8981<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>Python\u306b\u9650\u3063\u305f\u3053\u3068\u3067\u306f\u306a\u3044\u3067\u3059\u304c\u3001\u30d7\u30ed\u30b0\u30e9\u30e0\u306e\u5358\u4f53\u30c6\u30b9\u30c8\u3092\u4f5c\u6210\u3059\u308b\u3068\u304d\u306b\u3001\u30c6\u30b9\u30c8\u5bfe\u8c61\u306e\u30e1\u30bd\u30c3\u30c9\u304c\u4f9d\u5b58\u3059\u308b\u30ea\u30bd\u30fc\u30b9\u3092\u30e2\u30c3\u30af\u3067\u7f6e\u304d\u63db\u3048\u308b\u3053\u3068\u304c\u3042\u308a\u307e\u3059\u3002<br>\u305f\u3068\u3048\u3070\u3001\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u304b\u3089\u5024\u3092\u53d6\u5f97\u3059\u308b\u51e6\u7406\u3092\u30e2\u30c3\u30af\u306b\u7f6e\u304d\u63db\u3048\u305f\u308a\u3001\u672a\u5b8c\u6210\u306eAPI\u306b\u4f9d\u5b58\u3057\u3066\u3044\u308b\u90e8\u5206\u3092\u30e2\u30c3\u30af\u306b\u7f6e\u304d\u63db\u3048\u305f\u308a\u3001\u3068\u3044\u3046\u3082\u306e\u3067\u3059\u3002<\/p>\n\n\n\n<p>\u30e2\u30c3\u30af\u3092\u4f7f\u3046\u3053\u3068\u306b\u3088\u3063\u3066\u3001\u30c6\u30b9\u30c8\u5bfe\u8c61\u305d\u306e\u3082\u306e\u306e\u30c6\u30b9\u30c8\u306b\u5c02\u5ff5\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002<br>\u305f\u3068\u3048\u3070\u3001\u4f9d\u5b58\u3059\u308b\u30e1\u30bd\u30c3\u30c9\u306b\u30d0\u30b0\u304c\u3042\u3063\u3066\u3082\u3001\u30c6\u30b9\u30c8\u5bfe\u8c61\u306e\u52d5\u4f5c\u304c\u6b63\u3057\u3051\u308c\u3070\u30c6\u30b9\u30c8\u3092\u901a\u3059\u3088\u3046\u306b\u3059\u308b\u3001\u3068\u3044\u3046\u3053\u3068\u304c\u53ef\u80fd\u306b\u306a\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<p>Python\u306e\u6a19\u6e96\u30e9\u30a4\u30d6\u30e9\u30ea\u3067\u3042\u308bunittest\u306b\u306f\u3001\u30e2\u30c3\u30af\u3092\u5b9f\u73fe\u3059\u308b\u305f\u3081\u306eMagicMock\u3068\u3044\u3046\u30af\u30e9\u30b9\u304c\u542b\u307e\u308c\u3066\u3044\u307e\u3059\u3002<br>\u3053\u306e\u8a18\u4e8b\u3067\u306f\u3001MagicMock\u3092\u4f7f\u7528\u3057\u305f\u30e2\u30c3\u30af\u306e\u5b9f\u88c5\u4f8b\u3092\u7d39\u4ecb\u3057\u305f\u3044\u3068\u601d\u3044\u307e\u3059\u3002<br>unittest\u306e\u8a73\u7d30\u306a\u4f7f\u3044\u65b9\u306a\u3069\u306f\u89e3\u8aac\u3057\u307e\u305b\u3093\u306e\u3067\u3001<a href=\"https:\/\/docs.python.org\/ja\/3.13\/library\/unittest.html\" data-type=\"link\" data-id=\"https:\/\/docs.python.org\/ja\/3.13\/library\/unittest.html\">\u516c\u5f0f\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8<\/a>\u306a\u3069\u3092\u53c2\u7167\u3057\u3066\u304f\u3060\u3055\u3044\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ python -V\nPython 3.10.12<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"%E4%BE%8B1\"><\/span>\u4f8b1<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>\u8db3\u3057\u7b97\u3092\u884c\u3046<code>IntegerAdd<\/code>\u30af\u30e9\u30b9\u3068\u5f15\u304d\u7b97\u3092\u884c\u3046<code>IntegerSub<\/code>\u30af\u30e9\u30b9\u304c\u3042\u308a\u307e\u3059\u3002<br><code>IntegerAdd<\/code>\u30af\u30e9\u30b9\u3067\u5b9f\u969b\u306e\u8a08\u7b97\u3092\u884c\u3046<code>exec()<\/code>\u30e1\u30bd\u30c3\u30c9\u306f\u307e\u3060\u5b9f\u88c5\u3055\u308c\u3066\u3044\u307e\u305b\u3093\u3002<br>\u5f15\u304d\u7b97\u3092\u884c\u3046<code>IntegerSub<\/code>\u30af\u30e9\u30b9\u306f<code>IntegerAdd<\/code>\u30af\u30e9\u30b9\u306b\u4f9d\u5b58\u3057\u3066\u304a\u308a\u3001<code>a - b<\/code>\u3092<code>a + (-b)<\/code>\u3068\u3059\u308b\u3053\u3068\u3067\u5f15\u304d\u7b97\u3092\u8db3\u3057\u7b97\u3068\u3057\u3066\u5b9f\u73fe\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u4ee5\u4e0b\u306e\u30b3\u30fc\u30c9\u3067\u306f\u3001<code>IntegerSub<\/code>\u30af\u30e9\u30b9\u306e\u30c6\u30b9\u30c8\u3092\u5b9f\u88c5\u3057\u307e\u3059\u3002<br>\u3053\u306e\u30c6\u30b9\u30c8\u3067\u78ba\u8a8d\u3057\u305f\u3044\u306e\u306f\u3001\u4ee5\u4e0b\u306e2\u70b9\u3067\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><code>IntegerAdd.exec()<\/code>\u304c\u60f3\u5b9a\u901a\u308a\u306e\u5f15\u6570\u3067\u5b9f\u884c\u3055\u308c\u3066\u3044\u308b\u304b<\/li>\n\n\n\n<li>(<code>IntegerAdd.exec()<\/code>\u304c\u6b63\u3057\u3044\u5024\u3092\u8fd4\u3059\u3068\u4eee\u5b9a\u3057\u3066)<code>IntegerSub.exec()<\/code>\u304c\u6b63\u3057\u3044\u5024\u3092\u8fd4\u3059\u304b<\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-luxe-blocks-syntaxhighlighter line-numbers language-python\"><code class=\"language-python\">import unittest\nfrom unittest.mock import MagicMock\n\n\nclass IntegerAdd:\n    def exec(self, a: int, b: int) -> int:\n        raise NotImplementedError\n\n\nclass IntegerSub:\n    def __init__(self, add: IntegerAdd):\n        self.__add = add\n\n    def exec(self, a: int, b: int) -> int:\n        return self.__add.exec(a, -b)\n\n\nclass TestIntegerSub(unittest.TestCase):\n    def setUp(self):\n        \"\"\"\n        \u5404\u30c6\u30b9\u30c8\u30b1\u30fc\u30b9\u3092\u5b9f\u884c\u3059\u308b\u524d\u306b\u5b9f\u884c\u3055\u308c\u308b\u30e1\u30bd\u30c3\u30c9\u3067\u3059\n        \"\"\"\n        self.add = IntegerAdd()\n        self.sub = IntegerSub(self.add)\n\n    def test_exec(self):\n        # IntegerAdd.exec()\u3092\u30e2\u30c3\u30af\u306b\u7f6e\u304d\u63db\u3048\u308b\n        # \u4eca\u56de\u306f10 - 2 = 8\u306e\u30c6\u30b9\u30c8\u3092\u884c\u3046\n        # IntegerAdd.exec()\u306f10 + (-2) = 8\u3092\u8fd4\u3059\u306f\u305a\u306a\u306e\u3067\u3001\u30e2\u30c3\u30af\u306ereturn_value\u30928\u306b\u3059\u308b\n        self.add.exec = MagicMock(return_value=8)\n\n        # IntegerSub.exec()\u3092\u5b9f\u884c\u3059\u308b\n        result = self.sub.exec(10, 2)\n\n        # IntegerAdd.exec()\u304cexec(10,-2)\u306e\u5f15\u6570\u3067\u5b9f\u884c\u3055\u308c\u305f\u3053\u3068\u3092\u78ba\u8a8d\u3059\u308b\n        self.add.exec.assert_called_with(10, -2)\n\n        # \u8a08\u7b97\u7d50\u679c\u304c8\u306b\u306a\u3063\u3066\u3044\u308b\u3053\u3068\u3092\u78ba\u8a8d\u3059\u308b\n        self.assertEqual(result, 8)\n\n    def test_exec_2(self):\n        def mock_ret(*args, **kwargs) -> int:\n            return args[0] + args[1]\n\n        self.add.exec = MagicMock(side_effect=mock_ret)\n        result = self.sub.exec(10, 2)\n        self.add.exec.assert_called_with(10, -2)\n        self.assertEqual(result, 8)\n\n\nif __name__ == \"__main__\":\n    unittest.main()<\/code><\/pre>\n\n\n\n<p><code>test_exec()<\/code>\u3067\u306f\u300110 &#8211; 2 = 8\u306e\u30c6\u30b9\u30c8\u3092\u5b9f\u884c\u3057\u307e\u3059\u3002<br><code>IntegerAdd.exec()<\/code>\u306f\u4eca\u56de\u306e\u30c6\u30b9\u30c8\u5bfe\u8c61\u3067\u306f\u306a\u3044\u306e\u3067\u30e2\u30c3\u30af\u306b\u7f6e\u304d\u63db\u3048\u307e\u3059\u3002<br>\u30e2\u30c3\u30af\u306e\u8fd4\u308a\u5024\u306f<code>return_value<\/code>\u3067\u6307\u5b9a\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-luxe-blocks-syntaxhighlighter line-numbers language-python\"><code class=\"language-python\">self.add.exec = MagicMock(return_value=8)<\/code><\/pre>\n\n\n\n<p><code>IntegerAdd.exec()<\/code>\u304c\u60f3\u5b9a\u901a\u308a\u306e\u5f15\u6570\u3092\u53d7\u3051\u53d6\u3063\u3066\u5b9f\u884c\u3055\u308c\u305f\u304b\u3069\u3046\u304b\u3092\u78ba\u8a8d\u3059\u308b\u305f\u3081\u306b\u306f\u3001<code>assert_called_with()<\/code>\u3092\u4f7f\u7528\u3057\u307e\u3059\u3002<br>\u4eca\u56de\u306e\u5834\u5408\u306f10 + (-2)\u306a\u306e\u3067\u300110\u3068-2\u3092\u5f15\u6570\u3068\u3057\u3066\u5b9f\u884c\u3055\u308c\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-luxe-blocks-syntaxhighlighter line-numbers language-python\"><code class=\"language-python\">self.add.exec.assert_called_with(10, -2)<\/code><\/pre>\n\n\n\n<p><code>IntegerSub.exec()<\/code>\u304c\u6b63\u3057\u3044\u5024\u3092\u8fd4\u3057\u3066\u3044\u308b\u304b\u3069\u3046\u304b\u306f<code>assertEqual()<\/code>\u3067\u78ba\u8a8d\u3057\u307e\u3059\u3002<br>\u4eca\u56de\u306e\u5834\u5408\u306f10 &#8211; 2 = 8\u306a\u306e\u3067\u3001\u671f\u5f85\u5024\u306f8\u3067\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-luxe-blocks-syntaxhighlighter line-numbers language-python\"><code class=\"language-python\">self.assertEqual(result, 8)<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p>\u5148\u306e\u4f8b\u3067\u793a\u3057\u305f\u3088\u3046\u306b\u3001MagicMock\u306e\u30d1\u30e9\u30e1\u30fc\u30bf<code>return_value<\/code>\u3092\u6307\u5b9a\u3059\u308b\u3068\u3001\u30e2\u30c3\u30af\u5b9f\u884c\u6642\u306b\u8fd4\u3055\u308c\u308b\u5024\u3092\u6307\u5b9a\u3067\u304d\u307e\u3059\u3002<br>\u30e2\u30c3\u30af\u5b9f\u884c\u6642\u306b\u6e21\u3055\u308c\u305f\u5f15\u6570\u306b\u3088\u3063\u3066\u30e2\u30c3\u30af\u306e\u8fd4\u308a\u5024\u3092\u5909\u5316\u3055\u305b\u305f\u3044\u5834\u5408\u306f\u3001<code>side_effect<\/code>\u3092\u4f7f\u7528\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-luxe-blocks-syntaxhighlighter line-numbers language-python\"><code class=\"language-python\">def mock_ret(*args, **kwargs) -> int:\n    return args[0] + args[1]\n\nself.add.exec = MagicMock(side_effect=mock_ret)<\/code><\/pre>\n\n\n\n<p><code>side_effect<\/code>\u306b\u306f\u95a2\u6570\u3092\u6307\u5b9a\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002<br>\u4eca\u56de\u306e\u4f8b\u3060\u3068\u3001<code>IntegerAdd.exec()<\/code>\u306f\u53d7\u3051\u53d6\u3063\u305f\u4e8c\u3064\u306e\u6574\u6570\u3092\u52a0\u7b97\u3057\u3066\u8fd4\u3059\u306e\u304c\u60f3\u5b9a\u3055\u308c\u308b\u52d5\u4f5c\u306a\u306e\u3067\u3001\u305d\u306e\u3088\u3046\u306a\u52d5\u4f5c\u3092\u3059\u308b\u95a2\u6570\u3092<code>side_effect<\/code>\u306b\u6307\u5b9a\u3057\u3066\u3044\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"%E4%BE%8B2\"><\/span>\u4f8b2<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>\u5929\u6c17\u4e88\u5831\u3092\u53d6\u5f97\u3057\u3066\u305d\u308c\u306b\u5bfe\u5fdc\u3059\u308b\u7d75\u6587\u5b57\u3092\u8fd4\u3059\u30af\u30e9\u30b9(<code>GetWeatherForecastEmojiUsecase<\/code>)\u306e\u30c6\u30b9\u30c8\u3092\u884c\u3046\u30b3\u30fc\u30c9\u3067\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-luxe-blocks-syntaxhighlighter line-numbers language-python\"><code class=\"language-python\">from abc import ABC, abstractmethod\nfrom unittest.mock import MagicMock\nimport unittest\n\n\nclass WeatherForecastRepository(ABC):\n    @abstractmethod\n    def get(self, city: str) -> str:\n        raise NotImplementedError\n\n\nclass WeatherForecaseRepositoryStub(WeatherForecastRepository):\n    def get(self, city: str) -> str:\n        if city == \"tokyo\":\n            return \"sunny\"\n        elif city == \"kyoto\":\n            return \"cloudy\"\n        elif city == \"nagasaki\":\n            return \"rainy\"\n        else:\n            raise RuntimeError(f\"\u4e0d\u660e\u306a\u90fd\u5e02\u540d\u3067\u3059: {city}\")\n\n\nclass GetWeatherForecastEmojiUsecase:\n    def __init__(self, repo: WeatherForecastRepository):\n        self.__repo = repo\n\n    def exec(self, city: str) -> str:\n        weather = self.__repo.get(city)\n\n        if weather == \"sunny\":\n            return \"\u2600\"\n        elif weather == \"cloudy\":\n            return \"\u2601\"\n        elif weather == \"rainy\":\n            return \"\u2602\"\n        else:\n            raise RuntimeError(f\"\u4e0d\u660e\u306a\u5929\u6c17\u3067\u3059: {weather}\")\n\n\nclass TestGetWeatherForecastEmojiUsecase(unittest.TestCase):\n    def setUp(self):\n        self.repo = WeatherForecaseRepositoryStub()\n        self.usecase = GetWeatherForecastEmojiUsecase(self.repo)\n\n    def test_exec(self):\n        expected_values = {\"sunny\": \"\u2600\", \"cloudy\": \"\u2601\", \"rainy\": \"\u2602\"}\n        for k, v in expected_values.items():\n            self.repo.get = MagicMock(return_value=k)\n            result = self.usecase.exec(\"tokyo\")\n            self.repo.get.assert_called_with(\"tokyo\")\n            self.assertEqual(result, v)\n\n    def test_exec_unknown_weather(self):\n        self.repo.get = MagicMock(return_value=\"sleet\")\n        with self.assertRaises(RuntimeError):\n            self.usecase.exec(\"tokyo\")\n\n        self.repo.get.assert_called_with(\"tokyo\")\n\n\nif __name__ == \"__main__\":\n    unittest.main()<\/code><\/pre>\n\n\n\n<p><code>WeatherForecastRepository<\/code>\u306f\u5929\u6c17\u4e88\u5831\u3092\u53d6\u5f97\u3059\u308b\u5177\u4f53\u7684\u306a\u5b9f\u88c5\u3078\u306e\u30a4\u30f3\u30bf\u30fc\u30d5\u30a7\u30fc\u30b9\u3092\u63d0\u4f9b\u3057\u307e\u3059\u3002<br>\u5b9f\u969b\u306b\u5929\u6c17\u4e88\u5831\u3092\u53d6\u5f97\u3059\u308b\u30af\u30e9\u30b9\u306f<code>WeatherForecastRepository<\/code>\u3092\u5b9f\u88c5\u3057\u3066\u3001\u5916\u90e8API\u3092\u5b9f\u884c\u3057\u305f\u308a\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u304b\u3089\u5024\u3092\u53d6\u5f97\u3057\u305f\u308a\u3001\u4f55\u3089\u304b\u306e\u5f62\u3067\u5929\u6c17\u4e88\u5831\u30c7\u30fc\u30bf\u3092\u53d6\u5f97\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<p><code>WeatherForecaseRepositoryStub<\/code>\u306f<code>WeatherForecastRepository<\/code>\u306e\u4eee\u306e\u5b9f\u88c5\u3067\u3001\u9069\u5f53\u306a\u5024\u3092\u8fd4\u3059\u3060\u3051\u3067\u3059\u3002<br>\u30c6\u30b9\u30c8\u3067\u306f\u3053\u306e\u30af\u30e9\u30b9\u3092\u4f7f\u7528\u3057\u307e\u3059\u304c\u3001\u5b9f\u969b\u306e\u30e1\u30bd\u30c3\u30c9\u306f\u30e2\u30c3\u30af\u3067\u7f6e\u304d\u63db\u3048\u3066\u3057\u307e\u3046\u305f\u3081\u3001\u3053\u306e\u30af\u30e9\u30b9\u306e\u4e2d\u8eab\u306b\u3064\u3044\u3066\u306f\u9069\u5f53\u306a\u3082\u306e\u3067\u554f\u984c\u3042\u308a\u307e\u305b\u3093\u3002<\/p>\n\n\n\n<p><code>test_exec()<\/code>\u306e\u51e6\u7406\u5185\u5bb9\u306b\u3064\u3044\u3066\u306f\u5148\u306b\u793a\u3057\u305f\u4f8b1\u3068\u540c\u3058\u3067\u3059\u3002<br>\u30e2\u30c3\u30af\u3067\u7f6e\u304d\u63db\u3048\u305f\u30e1\u30bd\u30c3\u30c9\u304c\u60f3\u5b9a\u901a\u308a\u306e\u5f15\u6570\u3067\u5b9f\u884c\u3055\u308c\u3066\u3044\u308b\u3053\u3068\u3068\u3001\u30c6\u30b9\u30c8\u5bfe\u8c61\u306e\u30e1\u30bd\u30c3\u30c9\u304c\u6b63\u3057\u3044\u5024\u3092\u8fd4\u3057\u3066\u3044\u308b\u3053\u3068\u3092\u78ba\u8a8d\u3057\u3066\u3044\u307e\u3059\u3002<\/p>\n\n\n\n<p><code>test_exec_unknown_weather()<\/code>\u3067\u306f\u3001\u30c6\u30b9\u30c8\u5bfe\u8c61\u306e\u30af\u30e9\u30b9\u304c\u60f3\u5b9a\u5916\u306e\u5024\u3092\u53d7\u3051\u53d6\u3063\u305f\u5834\u5408\u306e\u52d5\u4f5c\u3092\u30c6\u30b9\u30c8\u3057\u3066\u3044\u307e\u3059\u3002<br>\u30e2\u30c3\u30af\u304b\u3089&#8221;sleet&#8221;\u3068\u3044\u3046\u60f3\u5b9a\u5916\u306e\u5024\u304c\u8fd4\u3055\u308c\u308b\u305f\u3081\u3001<code>GetWeatherForecastEmojiUsecase.exec()<\/code>\u3067\u306f\u4f8b\u5916\u304c\u767a\u751f\u3059\u308b\u306e\u304c\u6b63\u3057\u3044\u52d5\u4f5c\u3067\u3059\u3002<br>\u4f8b\u5916\u304c\u767a\u751f\u3059\u308b\u3053\u3068\u3092\u78ba\u8a8d\u3059\u308b\u305f\u3081\u306b\u306f\u3001<code>assertRaises()<\/code>\u3092\u4f7f\u7528\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-luxe-blocks-syntaxhighlighter line-numbers language-python\"><code class=\"language-python\">def test_exec_unknown_weather(self):\n    self.repo.get = MagicMock(return_value=\"sleet\")\n    with self.assertRaises(RuntimeError):\n        self.usecase.exec(\"tokyo\")\n\n    self.repo.get.assert_called_with(\"tokyo\")<\/code><\/pre>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u6982\u8981 Python\u306b\u9650\u3063\u305f\u3053\u3068\u3067\u306f\u306a\u3044\u3067\u3059\u304c\u3001\u30d7\u30ed\u30b0\u30e9\u30e0\u306e\u5358\u4f53\u30c6\u30b9\u30c8\u3092\u4f5c\u6210\u3059\u308b\u3068\u304d\u306b\u3001\u30c6\u30b9\u30c8\u5bfe\u8c61\u306e\u30e1\u30bd\u30c3\u30c9\u304c\u4f9d\u5b58\u3059\u308b\u30ea\u30bd\u30fc\u30b9\u3092\u30e2\u30c3\u30af\u3067\u7f6e\u304d\u63db\u3048\u308b\u3053\u3068\u304c\u3042\u308a\u307e\u3059\u3002\u305f\u3068\u3048\u3070\u3001\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u304b\u3089\u5024\u3092\u53d6\u5f97\u3059\u308b\u51e6\u7406\u3092\u30e2\u30c3\u30af\u306b\u7f6e\u304d\u63db\u3048 [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[24,16],"tags":[],"class_list":["post-1423","post","type-post","status-publish","format-standard","hentry","category-python","category-16"],"_links":{"self":[{"href":"https:\/\/daba-no-heya.com\/index.php?rest_route=\/wp\/v2\/posts\/1423","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/daba-no-heya.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/daba-no-heya.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/daba-no-heya.com\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/daba-no-heya.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1423"}],"version-history":[{"count":7,"href":"https:\/\/daba-no-heya.com\/index.php?rest_route=\/wp\/v2\/posts\/1423\/revisions"}],"predecessor-version":[{"id":1442,"href":"https:\/\/daba-no-heya.com\/index.php?rest_route=\/wp\/v2\/posts\/1423\/revisions\/1442"}],"wp:attachment":[{"href":"https:\/\/daba-no-heya.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1423"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/daba-no-heya.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1423"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/daba-no-heya.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1423"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}