账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    关于mock.patch()和mock.patch.object()的区别的问题
    57
    0

    大家好!

    这可能是一个关于unittest.mock.patch()unittest.mock.patch.object()的区别的问题,下面的代码使用mock.patch.object()时,可以正常运行,我不明白为什么使用mock.patch()的时候,会报错ModuleNotFoundError: No module named 'Person',这种情况是一定不能用mock.patch()吗?

    # py_unittest.py
    
    from unittest import TestCase
    from unittest.mock import patch
    from unittest import main
         
         
    class Person(object):
        def __init__(self, name):
            self.name = name
            
        def print_name(self):
            print('My name is ' + self.name)
            
        def print_parents(self):
            mother = input("Enter mother's name: ")
            father = input("Enter father's name: ")
         
            print("{}'s parents are {} and {}.".format(self.name, mother, father))
            self.fake_func()
    
        def fake_func(self):
            pass
    
    class FuncTest(TestCase):
        def test_print_parents(self):
            john = Person('John')
                 
            with patch('builtins.input') as mocked_input:
                mocked_input.side_effect = ('Jo', 'Lee')
                with patch('builtins.print') as mocked_print:
                    with patch.object(Person, "fake_func") as mocked_fake_func:
                    # with patch('Person.fake_func') as mocked_fake_func: 如果启用这段代码会报错 ModuleNotFoundError: No module named 'Person'
                        john.print_parents()
                        mocked_print.assert_called_with("John's parents are Jo and Lee.")
                        mocked_fake_func.assert_called_once()
     
    if __name__ == '__main__':
        main()
    
    0
    打赏
    收藏
    点击回答
        全部回答
    • 0
    • mock.patchmock.patch.object 都用于在测试中模拟真实对象的行为,但它们之间有一些区别。

      mock.patch 是用来替换现有函数或方法的行为,而 mock.patch.object 是用来替换现有类的行为。这意味着,如果你有一个函数或方法,你可以在 mock.patch.object 中对其进行修改,而不会影响到现有的代码。

      例如,假设我们有一个名为 user 的类,它有一个名为 get_name 的方法。我们想要在测试中替换 user.get_name 的行为,但不改变这个方法的输入。我们可以这样做:

      ```python from mock import patch

      class TestUser:

      def test_get_name(self):
          user = User()
      
          # 创建一个真实的 get_name 方法,然后将其替换为我们的模拟方法
          with patch.object(user, 'get_name', return_value='John Doe'):
              user.get_name()
      
          # 现在,当我们调用 `user.get_name()` 时,它将返回 'John Doe' 而不是真实的 get_name 方法
          assert user.get_name() == 'John Doe'
      

      ```

      在上面的例子中,我们首先创建了一个 User 类和一个 get_name 方法。然后,我们使用 patch.object(user, 'get_name', return_value='John Doe') 来模拟 get_name 方法的行为。最后,我们调用 user.get_name(),它将返回 'John Doe' 而不是真实的 get_name 方法。

      mock.patch.object 是用来替换现有类的行为。这意味着,如果你想在一个类中替换一个方法的行为,你可以在 mock.patch.object 中对其进行修改,而不会影响到现有的代码。

      例如,假设我们有一个名为 Person 的类,它有一个名为 get_name 的方法。我们想要在测试中替换 Person.get_name 的行为,但不改变这个方法的输入。我们可以这样做:

      ```python from mock import patch

      class TestPerson:

      def test_get_name(self):
          person = Person()
      
          # 创建一个真实的 get_name 方法,然后将其替换为我们的模拟方法
          with patch.object(person, 'get_name', return_value='John Doe'):
              person.get_name()
      
          # 现在,当我们调用 `person.get_name()` 时,它将返回 'John Doe' 而不是真实的 get_name 方法
          assert person.get_name() == 'John Doe'
      

      ```

      在上面的例子中,我们首先创建了一个 Person 类和一个 get_name 方法。然后,我们使用 patch.object(person, 'get_name', return_value='John Doe') 来模拟 get_name 方法的行为。最后,我们调用 person.get_name(),它将返回 'John Doe' 而不是真实的 get_name 方法。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部