ここに投稿された質問に似た質問がありますが、満足のいく答えはまだありません:
Python で引数を使用して別の再利用可能なメソッドでメソッド
をモックする Using mock patch to mock an instance method
次の Production クラスと UnitTest クラスがあります。UnitTest クラスの 2 番目のテスト ケースでは、Unit Test クラスの上で定義した偽のメソッドを実際のメソッドに置き換えたいと考えています。ただし、テスト中のシステムのメソッドを、その入力引数を含めeven_numbers
て偽のメソッドに接続できません。odd_numbers
この置換はどのように見えるべきですか? Python 2.7 を使用しています。
import unittest
from mock import patch
class ProdClass(object):
def even_numbers(self, numbers):
print 'This is the real method'
return [n for n in numbers if n%2 == 0]
def odd_numbers(numbers):
print 'This is the mock'
return [n for n in numbers if n%2 != 0]
class MockingTestTestCase(unittest.TestCase):
def test_even_numbers_01(self):
sut = ProdClass()
result = sut.even_numbers(range(10))
expected_result = [0, 2, 4, 6, 8]
self.assertEqual(result, expected_result,
msg = '\nRetrieved: \n{0}\nExpected: \n{1}'.format(result, expected_result))
@patch('ProdClass.even_numbers')
def test_even_numbers_02(self, mock_even_numbers):
sut = ProdClass()
'''Substitute real method even_numbers with mocked method even_numbers here'''
mock_even_numbers.return_value = odd_numbers
result = sut.even_numbers(range(10))
expected_result = [1, 3, 5, 7, 9]
self.assertEqual(result, expected_result,
msg = '\nRetrieved: \n{0}\nExpected: \n{1}'.format(result, expected_result))
if __name__ == "__main__":
unittest.main()
EDIT:以下のMartijnの助けを借りて、コードをこの作業例に編集しました:
import unittest
from mock import patch
class ProdClass(object):
def even_numbers(self, numbers):
print 'This is the real method'
return [n for n in numbers if n%2 == 0]
def odd_numbers(numbers):
print 'This is the mock'
return [n for n in numbers if n%2 != 0]
class MockingTestTestCase(unittest.TestCase):
def test_even_numbers_01(self):
sut = ProdClass()
result = sut.even_numbers(range(10))
expected_result = [0, 2, 4, 6, 8]
self.assertEqual(result, expected_result,
msg = '\nRetrieved: \n{0}\nExpected: \n{1}'.format(result, expected_result))
@patch.object(ProdClass, 'even_numbers')
def test_even_numbers_02(self, mock_even_numbers):
sut = ProdClass()
'''Substitute real method even_numbers with mocked method even_numbers here'''
mock_even_numbers.side_effect = odd_numbers
result = sut.even_numbers(range(10))
expected_result = [1, 3, 5, 7, 9]
self.assertEqual(result, expected_result,
msg = '\nRetrieved: \n{0}\nExpected: \n{1}'.format(result, expected_result))
if __name__ == "__main__":
unittest.main()