【问题标题】:Mocking a web page in Python [duplicate]用Python模拟网页[重复]
【发布时间】:2018-03-18 12:27:15
【问题描述】:

我正在编写一个小型 Python 烧瓶应用程序,其唯一目的是发出请求以获取一个特定 URL(始终相同)的网页并解析部分内容。该应用程序显示两个端点,/games/ 和 /games/。如果是前者,则返回网页上列出的所有游戏的信息,如果是后者,则仅返回该游戏的信息。

我被要求编写单元测试并将网页视为数据,但我认为测试不应该通过网络到达目标 URL,所以我想做它以便从文件中读取网页我用 curl 制作并使用它作为来源。

我正在努力解决的是如何通过 requests.get() 调用将数据插入到响应对象中。我已经浏览了一页又一页的关于如何进行模拟的示例,但是对于如何做到这一点,没有一个清晰、简单的解释。

这就是我需要做的全部。我有一个来自原始网站的 html 文件,我希望响应数据来自文件,而不是网站。

有什么想法吗?

更新:

我自己想出来的:

我将调用 requests.get 的行分离到一个函数 get_html 中,然后在测试应用程序中模拟它。

@mock.patch ('myflaskApp.get_html')
def test_get_html(get_html):
  theSession = requests.Session()
  theSession.mount('file://', FileAdapter())
  resp = theSession.get('file://'+os.getcwd()+'/mytestdata.html')

然后我意识到我不需要模拟任何东西,从而进一步简化了事情。我更改了 get_html() 以检查 app.testing 标志是否为真,并让它以这种方式加载适配器,否则进行常规获取。

【问题讨论】:

  • responses - 你可以随心所欲地制作身体。

标签: python flask mocking python-requests


【解决方案1】:

您可以使用unittest.mock 库来拦截请求并像这样测试它们:

try:
    from unittest import mock
except ImportError:
    import mock  # noqa

接下来你获取一个函数并替换它的调用:

@mock.patch('requests.get')
def test_fetch(self, mock_get):
    # perform some actions then check it was called with correct number of parameters
    self.assertEqual(len(mock_get.call_args_list), 3)
    # and right parameter values
    self.assertIn(mock.call('http://someurl.com/test.json'), mock_get.call_args_list)

这里有详细信息 - https://docs.python.org/3/library/unittest.mock.html

【讨论】:

  • 这很令人困惑,因为你告诉我我应该尝试一些东西,而不是 在哪里。这可以在 Flask 应用程序中使用吗?在单独的测试应用程序中?什么是“telegram.bot”?这里有太多的知识假设...... :(
  • 抱歉,这是从旧项目之一复制粘贴的。我会更好地描述。
  • 好的,但是我把这个放在哪里?在 Flask 应用程序中?在单独的应用中?
  • 我想通了。我真正需要做的是模拟该函数,然后使用 requests-file 及其文件适配器。感谢您提供使我得到答案的提示。 :)
  • 抱歉没有找到更好的例子。很高兴听到这是可用的:))祝你好运)
猜你喜欢
  • 1970-01-01
  • 2020-03-09
  • 1970-01-01
  • 1970-01-01
  • 2015-01-27
  • 2014-01-22
  • 1970-01-01
  • 1970-01-01
  • 2015-11-02
相关资源
最近更新 更多