2017-10-17 4 views
0

特定のWebサイトから「長い」投稿を削りたいとします。私は「...私は、このためのユニットテストを書きたいのですが、私はきちんとそれについて移動するかどうかはわかりません取得リクエストを実行するユニットテストクラスの方法

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で少し新しいです。このアプローチは理にかなっていますか?どのように私はこれについて行く必要がありますか?

+1

おそらく、あなたのメソッドがあまりにも多すぎることを望まないでしょう。ページを取得し、解析し、すべての投稿を抽出し、それらをフィルタリングします。リファクタリングを単一の目的のメソッドにすると、テストが簡単になります。 –

答えて

0

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を割り当てることができます作成されました。

関連する問題