from http://oyanglul.us
近来在用 nosetests 和 mock1 为 bottle 运用测试, 发明几个运用nosetests 要注重的 处所:
1 patch method of module
patch 一个导入 module 的 method, 由于 method 已被导入到目的文件, 因而必需 要 patch 目的文件的 该要领, 而不是原 module.
# wsgi.py from db import get_db def insert_something(): get_db().insert(something) # test.py import wsgi # @patch('db.get_db') # this won't work @patch('wsgi.get_db') # should patch wsgi def test_insert(mock_get_db): mock_get_db.return_value = Database() ...
2 patch decorator
Scenario : bottle 的 views 是用 decorator 来定义的, 也就是说当我们测试 bottle 中 得 action 时实在这个 action 是被 views 包住的. return 的 dict 会被 bottle 的 views 函数 render 成 html 并返回. 而我们并不需要测试 views 返回的 html, 而只需要测试 return 的 dict 是不是准确.
这类状况太合适 mock 的 patch 来干了.
- patch bottle.view
- 让其返回一个神马都没干的函数
- 启动这个patch
- 导入需要测试的运用代码
注重 这里的patch必需在 import 你的 application 之前, 比方我的运用是 wsgi.py
完全历程是如许的
from mock import patch, Mock import bottle v = patch("bottle.view",return_value = lambda x : x) v.start() ** 运用 local config 来寄存你的密匙 import wsgi
3 mock module that may not exist
Scenario: 一些带有密匙的设置文件(比方 google api key 之类的)并不愿望被上传到 github public 上, 然则测试又需要引入这些文件.(厥后我发明了更 elegant 的处理体式格局 运用 local config 来寄存你的密匙). 假定如今含密匙的设置文件叫 config.py, 目的文件是 wsgi.py
如许的话用 patch 不会起任何作用, 由于在你 patch 的时刻, 必需要起首引 入目的文件, 因而目的文件中的import config 会先抛非常.
好吧, 如今我们必需在引入 wsgi 之前就 patch config. 我们将直接让体系的 config 模块即是 mock 的 config. 如许再引入 wsgi 就没有任何问题了.
import sys config_mock = Mock(spec=['config']) config_mock.__name__ = 'config' sys.modules['config'] = config_mock
4 运用 travis ci 延续集成
延续集成最简朴的设置当然是 Travis CI. 只需要 增添设置文件 .travis.yml
, 只需要定义4个东西. 下面是我的 .travis.yml
language: python python: - "2.7" # version install: "pip install -r requirements.txt --use-mirrors" # requirements script: nosetests # test or build command
5 运用 local config 来寄存你的密匙
这类体式格局源于 django. 倏忽想到 django 的 settings.py 末了几行
try: from local_settings import * except: pass
意义是从 local_settings
里的一切设置导入, 因而能够把真的带密匙的真是设置 写到 local_settings
中.
Footnotes:
: mock is now part of the python 3 now. Whee…..
view raw
2013-06-11-use-mock-in-python.markdown hosted with ❤ by
GitHub