如何对执行get请求的类进行单元测试

2024-04-27 05:18:29 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我想从一个特定的网站上抓取“长”的帖子。为此,我创建了以下类:

import requests

class PostScraper:

    THRESHOLD = 100

    def __init__(self, thread_id):
        self.url = 'foo.bar/thread-%s?pg=last' % thread_id

    def get_long_posts(self):
        page = requests.get(self.url)
        soup = BeautifulSoup(page.content, 'html.parser')
        posts = soup.find_all('div', 'post-text')
        return [post if len(post.text) > THRESHOLD for post in posts]

我想为此编写一个单元测试,但我不知道如何正确地进行。。。我在想象这样一条伪Python:

def test_getting_long_posts():
    scraper = PostScraper(None) # <- Not sure what to pass in. Advice?
    stub = {'text': '<html></html>', 'status': '200'}
    bind(url=scraper.url, response=stub)
    posts = scraper.get_long_posts()
    assert.equals(len(posts), 0)

我对单元测试有些陌生,尤其是Python。这种方法有意义吗?我该怎么办?你知道吗


Tags: textselfidurlgetthresholddefhtml
1条回答
网友
1楼 · 发布于 2024-04-27 05:18:29

编写类时最好将获取url文本内容的过程与扫描文本以获得合适帖子的过程分开。你知道吗

这样,您就可以用已知数量的合适帖子创建自己手工制作的html文本,并测试函数是否准确地找到了该数量。你知道吗

这将是实现分离的一种方法:

class PostScraper(object):

    THRESHOLD = 100

    def __init__(self, thread_id):
        self.url = 'foo.bar/thread-%s?pg=last' % thread_id
        self.content = None

    def fetch_page(self):
        self.content = requests.get(self.url).content

    def get_long_posts(self):
        soup = BeautifulSoup(self.content, 'html.parser')
        posts = soup.find_all('div', 'post-text')
        return [post if len(post.text) > THRESHOLD for post in posts]

在测试代码时,您根本不会调用fetch_page(),而是可以直接将self.content指定为您创建的任何虚假页面内容。你知道吗

相关问题 更多 >