def test(self): # mydatetime.datetimeにパッチを当てるなら # mydatetimeをトップレベルでインポートしても大丈夫。 # やはりdatetime.datetimeに手を入れるのが間違いのようだ。 with mock.patch("mydatetime.datetime") as M: M.now.return_value = 10 self.assertEqual(mydatetime.now(), 10) # nowをモックに置き換えようとするとエラーになる。 # nowではなくdatetimeの方を置き換えるのが正解。 with self.assertRaises(TypeError): # TypeError: # can't set attributes of # built-in/extension type 'datetime.datetime' with mock.patch("datetime.datetime.now") as M2: M2.return_value = 77 self.assertEqual(mydatetime.now(), 77) with self.assertRaises(TypeError): # TypeError: # can't set attributes # of built-in/extension type 'datetime.datetime' with mock.patch("mydatetime.datetime.now") as M3: M3.return_value = 77 self.assertEqual(mydatetime.now(), 77)
def test_builtin_extension1(self): """datetime.nowをモックに置き換えようとするとエラーになる。 nowではなくdatetimeの方を置き換えるのが正解。 """ # TypeError: can't set attributes of # built-in/extension type 'datetime.datetime' with mock.patch("datetime.datetime.now") as M: M.return_value = 77 self.assertEqual(mydatetime.now(), 77)
def test_builtin_extension1(self): """datetime.nowをモックに置き換えようとするとエラーになる。 nowではなくdatetimeの方を置き換えるのが正解。 """ # TypeError: can't set attributes of # built-in/extension type 'datetime.datetime' self.mox.StubOutWithMock(datetime.datetime, "now") datetime.datetime.now().AndReturn(77) self.mox.ReplayAll() self.assertEqual(mydatetime.now(), 77)
def test_builtin_extension2(self): """datetime.nowをモックに置き換えようとするとエラーになる。 mydatetimeに所属するdatetime.nowでも 結局のところ組み込みのdatetime.nowを指すのでやはりエラーになる。 """ # TypeError: can't set attributes # of built-in/extension type 'datetime.datetime' with mock.patch("mydatetime.datetime.now") as M: M.return_value = 77 self.assertEqual(mydatetime.now(), 77)
def test_builtin_extension2(self): """datetime.nowをモックに置き換えようとするとエラーになる。 mydatetimeに所属するdatetime.nowでも 結局のところ組み込みのdatetime.nowを指すのでやはりエラーになる。 """ # TypeError: can't set attributes # of built-in/extension type 'datetime.datetime' self.mox.StubOutWithMock(mydatetime.datetime, "now") mydatetime.datetime.now().AndReturn(77) self.mox.ReplayAll() self.assertEqual(mydatetime.now(), 77)
def test_import_timing(self): """インポートのタイミングによって結果が変わることを示す例。 こちらはモックがうまく適用される。 前提: mydatetimeがdatetimeをインポートする。 1. datetime.datetimeをモックと置き換える。 2. mydatetimeをインポートする。 3. mydatetimeの中でdatetimeがインポートされる。 (この時点で既にdatetime.datetimeはモックに置き換わっている。) 4. モックに置き換えられたのdatetime.nowを使うのでテストは成功する。 NOTE: 正解はインポートのタイミングを変えることではなくて、 mydatetime.datetimeにモックを適用することなので注意。 (datetime.datetimeを対象にしない) """ with mock.patch("datetime.datetime") as M: M.now.return_value = 10 import mydatetime self.assertEqual(mydatetime.now(), 10)
def test_import_timing(self): """インポートのタイミングによって結果が変わることを示す例。 前提: mydatetimeがdatetimeをインポートする。 1. datetimeをインポートする。 2. mydatetimeをインポートする。 3. mydatetimeの中でdatetimeがインポートされる。 4. datetime.datetimeをモックと置き換える。 5. 2のdatetimeと3のdatetimeは別扱いなので mydatetime.datetimeを利用するmydatetime.nowはモックを見ない。 6. モックに置き換えられる前のdatetime.nowを使うのでテストが失敗する。 NOTE: 正解はインポートのタイミングを変えることではなくて、 mydatetime.datetimeにモックを適用することなので注意。 (datetime.datetimeを対象にしない) """ import datetime import mydatetime self.mox.StubOutWithMock(datetime, "datetime") datetime.datetime.now().AndReturn(10) self.mox.ReplayAll() self.assertEqual(mydatetime.now(), 10)
def test_import_timing(self): """インポートのタイミングによって結果が変わることを示す例。 前提: mydatetimeがdatetimeをインポートする。 1. mydatetimeをインポートする。 2. mydatetimeの中でdatetimeがインポートされる。 3. datetime.datetimeをモックと置き換える。 4. 2のdatetimeと3のdatetimeは別扱いなので mydatetime.datetimeを利用するmydatetime.nowはモックを見ない。 5. モックに置き換えられる前のdatetime.nowを使うのでテストが失敗する。 NOTE: 正解はインポートのタイミングを変えることではなくて、 mydatetime.datetimeにモックを適用することなので注意。 (datetime.datetimeを対象にしない) """ # ここでmydatetimeをインポートすると失敗する。 # AssertionError: # datetime.datetime(2012, 9, 5, 10, 42, 3, 984193) != 10 import mydatetime with mock.patch("datetime.datetime") as M: M.now.return_value = 10 self.assertEqual(mydatetime.now(), 10)
def test_import_timing(self): """インポートのタイミングによって結果が変わることを示す例。 こちらはモックがうまく適用される。 前提: mydatetimeがdatetimeをインポートする。 1. datetimeをインポートする。 2. datetime.datetimeをモックと置き換える。 3. mydatetimeをインポートする。 4. mydatetimeの中でdatetimeがインポートされる。 (この時点で既にdatetime.datetimeはモックに置き換わっている。) 5. モックに置き換えられたのdatetime.nowを使うのでテストは成功する。 NOTE: 正解はインポートのタイミングを変えることではなくて、 mydatetime.datetimeにモックを適用することなので注意。 (datetime.datetimeを対象にしない) """ import datetime self.mox.StubOutWithMock(datetime, "datetime") import mydatetime # StubOutWithMockの前にインポートするとモックが当たらない。 datetime.datetime.now().AndReturn(10) self.mox.ReplayAll() self.assertEqual(mydatetime.now(), 10)
def _callFUT(self): return mydatetime.now()
def test(self): import mydatetime self.assertEqual(mydatetime.now(), 10)
def test(self): self.assertEqual(mydatetime.now(), 10)
def _callFUT(self): import mydatetime return mydatetime.now()