A03ki / uecbbs

@uec_bbsを支えるPythonパッケージTwissifyの管理
https://twitter.com/uec_bbs
MIT License
0 stars 0 forks source link

`Timeline.home_timeline`の`since_id`と`max_id`を保存する箇所をメソッドとして分けるべき #38

Closed A03ki closed 4 years ago

A03ki commented 4 years ago

前提

Timeline

Timeline.home_timelineは以下のコードで記述されている。

    def home_timeline(self, count, since_id=None, max_id=None):
        ...
        tweets = self._api.home_timeline(count=count, since_id=since_id,
                                         max_id=max_id)
        timeline_name = self.home_timeline.__name__

        if tweets != []:
            try:
                self._storage.create_ids(timeline_name, tweets)
            except ValueError:
                self._storage.update_ids(timeline_name, tweets)

        return tweets

TestTimeline

TestTimeline.test_home_timeline_storage_create_idsは以下のコードで記述されている。

    def test_home_timeline_storage_create_ids(self):
        expectation_tweets = [1]
        api = Mock(**{"home_timeline.return_value": expectation_tweets})
        storage = Mock()
        timeline = Timeline(api, storage)
        expectation_kwargs = {"count": 200,
                              "since_id": 20,
                              "max_id": 2}
        actual = timeline.home_timeline(**expectation_kwargs)
        self.assertEqual(expectation_tweets, actual)

        storage.create_ids.assert_called_once_with("home_timeline",
                                                   expectation_tweets)

問題点

Timeline

タイムラインのsince_idmax_idを保存する箇所が以下のコードだが、この処理はhome_timelineに限らない。つまり、今後実装するであろうmentions_timelineretweets_of_meuser_timelineでも同様の処理を行いたい。

        if tweets != []:
            try:
                self._storage.create_ids(timeline_name, tweets)
            except ValueError:
                self._storage.update_ids(timeline_name, tweets)

        return tweets

TestTimeline

もしTimelineクラスにmentions_timelineメソッドを追加した場合、test_home_timeline_storage_create_idsと同じ様なテストコードを書くことになる。同じことがtest_home_timeline_apitest_save_timeline_ids_update_idsでも言える。

解決策

since_idmax_idを保存するためのTimeline.save_timeline_idsを作成し、該当箇所を置き換える。

    def home_timeline(self, count, since_id=None, max_id=None):
        ...
        tweets = self._api.home_timeline(count=count, since_id=since_id,
                                         max_id=max_id)
        self.save_timeline_ids(self.home_timeline.__name__, tweets)
        return tweets

この変更を行うと、テストコードもTestTimeline.test_save_timeline_ids_create_idsの1つだけを作れば良くなる。