datetime.nowを使ったコードを単体テストする方法

前回と同じくPythonのUTに関するメモ書き。 datetime.now(現在日時)を利用したコードの単体テストの方法についてまとめます。

まずは、サンプルコード。現在日時を取得するメソッドです。

import datetime

def echo_current_time():
    return 'current time: {0}'.format(
        datetime.datetime.now().strftime('%Y-%m-%d')
    )

if __name__ == '__main__':
    print(echo_current_time())

以下は、UTコードになります。実行時間によって結果が変わるので、datetimeにモックを当てたくなりますが、下記の通りエラーになります。

from mock import patch
from nose.tools import eq_, nottest

@patch('datetime.datetime.strftime')
def test_echo_current_time ...
more ...

関数デコレータを単体テストする方法

Pythonの関数デコレータのテストについて、あまり情報がなかったので調べてみました。

まずはサンプル。FLAGがFalseの時に、例外が出る関数デコレータです。

FLAG = True

def deco(func):
    import functools

    @functools.wraps(func)
    def wrapper(*arg, **kwargs):
        if FLAG:
            func(*arg, **kwargs)
        else:
            raise Exception('FLAG is false.')

    return wrapper

@deco
def hoge():
    print 'hoge'

if __name__ == '__main__':
    hoge() # print 'hoge'

    FLAG = False
    hoge()  # raise Exception

テストメソッドを記述するためには、以下の2つのことを行う必要があります ...

more ...

Blogを移行しました。

この度はブログを「はてなブログ」から「Github Pages」へ移行することにしました。

一応動機ですが...

  • ローカル + Markdownな環境でブログ記事を書きたかった。はてなブログもMarkdownは使えますが、記事の編集はブログサイト上から行う必要があり、ローカルの下書きと二重管理を行う必要がありました。今回の移行で、ローカルのMarkdownがそのままブログ記事になるので、よりシンプルな運用が出来るようになりました。また、データを自分側で管理することにより、iPhone連携も容易になりました。これについては、追々記事にしようかと思います。
  • 旧Github Pages(自己紹介 + 作ったアプリの紹介ページを作っていました。)とブログ環境を統一化させたかった。複数管理が面倒。旧ページは、HTMLを直書きしていました。ありえない...
  • 技術ブログをGithub Pagesで書いたり、静的サイトジェネレータの利用が流行っているらしいから。

という感じです。もちろん、移行によるデメリットもあるのですが、静的サイトジェネレータのプラグインなどを使って徐々に解決させようかと考えています。

今回、静的サイトジェネレータとして、Python実装の「Pelican」を採用しました。日本語の情報が少なくて、色々つまずいたところがあったので、これも記事にしていきたいです。

ブログの方針としては、今まで通りプログラミングをして躓いた際の備忘録的に使っていこうと思います。たまには、異なる趣旨のことも書くかもしれません。また ...

more ...