現在時刻取得のテスト、nosetestsの単体実行

現在時刻取得系のメソッドのテスト方法


例えば、スクリプト実行時の現在時刻を取得して、適当な文字列を返してやるメソッドを定義したとする。 こんなかんじ

from datetime import datetime

def generate_parsed_date():
    dt = datetime.datetime.today()
    hour, minute, sec = str(dt.hour), str(dt.minute), str(dt.second)
    return hour + ':' + minute + ':' + sec


generate_parsed_date()
#=> 12:23:23
#みたいな感じに返ってくる


テストコード

上記のようなテストコードでは、todayが基本的に毎回2014年1月1日を返してくれるようにしないとメソッドのテストが出来ない。


最初はmockを使って以上みたいな感じのことをやるのかなー、と思って以下のような感じのことをしたけど、上手い具合に動かなかった。

下記のクラスメソッドのデコレータを使う方法を用いると、いい感じになった。

testing - Python: Trying to mock datetime.date.today() but not working - Stack Overflow
http://stackoverflow.com/questions/4481954/python-trying-to-mock-datetime-date-today-but-not-working

import datetime
class NewDate(datetime.date):
    @classmethod
    def today(cls):
        return cls(2014, 1, 1)
datetime.date = NewDate

datetime.datetime.today()
#->NewDate(2014, 1, 1)

nosetestsの単体実行

rspecだとテストメソッドに対して、:focusみたいなシンボルを付けると、単体の実行が出来る。 nosetestsだと、

python - How do I specify a single test in a file with nosetests? - Stack Overflow http://stackoverflow.com/questions/11286688/how-do-i-specify-a-single-test-in-a-file-with-nosetests

上記のリンクによると、python ファイル名:テストクラス:テストメソッド順に実行すれば出来る。

例えば、

vim some_hoge.py

で作成したテストコードのファイルを

from nose.tools import eq_, ok_

class Hoge(object):
    def test_fuga():
        eq_(1, int("1"))

の時は、

nosetets some_hoge.py:Hoge:test_fugaとやると、test_fugaのみ実行が可能になる。