使用Py.Test进行单元测试的Python模拟

时间:2016-05-04 15:54:54

标签: python unit-testing pytest

class TestHBVbs3(object):
      @patch.object(Hbvbs3, 'GetConfigClass')
      def test_get_grower_list(self, config_data, mock_requests_get):
          # Arrange
          config_data.return_value = ConfigMock()
          post_response = {'1st_key': '1st_value', '2nd_key': '2nd_Value'}
          mock_requests_get.return_value = MagicMock(status_code=200, post_response=post_response)

          # Act
          sut = Hbvbs3()
          the_response = sut.get_growers_list()

          # Assert
          assert_equals(the_response.response["1st_key"], mock_requests_get.return_value.response["1st_key"])
          assert_equals(the_response.response["2nd_key"], mock_requests_get.return_value.response["2nd_key"])
          assert_equals(the_response.response, mock_requests_get.return_value.response)
          assert_equals(the_response.status_code, mock_requests_get.return_value.status_code)

Actual code in hbvbs3.py:
class Hbvbs3(object):
        _logger = log.logging.getLogger("Hbvbs3")

    def get_growers_list(self):
            dbconfig = GetConfigClass()

我的问题: 我无法弄清楚如何成功使用注释来模拟这个: @ patch.object(Hbvbs3,' GetConfigClass')#这段代码不起作用。 我不得不最终只是将GetConfigClass实例化放入一个实用程序方法并模拟该调用,但希望我可以获得帮助,实际上在方法本身中模拟这个特定的实例化:" get_growers_list(self):" ... - 如何使用模拟注释在我的类Hbvbs3的实例方法中成功模拟这种实例化? 我在注释中尝试了各种组合,例如:

@patch('Hbvbs3.GetConfigClass')
@patch.object(Hbvbs3, '__main__.GetConfigClass')
@patchHbvbs3('_get_growers_list.GetConfigClass')

这些都不起作用,所以有没有办法在python中使用注释简单地模拟这种实例化?这看起来并不难,但如果能找到正确的注释组合,我就会受到威胁。 请让我知道我哪里出错了? 谢谢!

1 个答案:

答案 0 :(得分:0)

看起来你的文件hbvbs3.py的代码在顶部有这种导入语句:

from config import GetConfigClass

... GetConfigClass用于Hbvbs3内显示的内容。因此,要使用GetConfigClass实例替换Mock,您可以使用patch的装饰器形式:

@patch('[...].hbvbsp3.GetConfigClass')

您需要确保使用的路径是hbvbsp3模块的完整路径(替换[...] - 为了清楚起见,我通常使用项目根目录中的完整python路径)。我总是发现Where to patch上的文档很有用。