2016-04-08 9 views
1

私はMockを使ってPythonで関数をテストする方法を学んでいます。私は Python Mockセッションを模擬するためのテスト

@social.route('/friends', methods=['GET', 'POST']) 
def friends(): 
    test_val = session.get('uid') 
    if test_val is None: 
     return redirect(url_for('social.index')) 
    else: 
     return render_template("/home.html") 

はしかし、私は試してみて、モックsession.get(「UID」)の値にどのように立ち往生しています、シンプルな機能のためのテストを記述しようとしています。これまでのところ、これは私の試みであったが、

@patch('session', return_value='') 
@patch('flask.templating._render', return_value='') 
def test_mocked_render(self, mocked, mock_session): 
    print "mocked", repr(self.app.get('/social/friends').data) 
    print "was _render called?", mocked.called 

この試みは完全に間違っている可能性があり、これは間違いなく、私はまだセッションを模擬することはできませんよと間違った方法です。しかし、誰かがこれを介して正しい方法で私を導くことができますか?ありがとう。

+0

あなたがセッション(またはテンプレートのレンダリング)をモックではないでしょうフラスコのドキュメントで説明したように、あなたはテストクライアントを使用します。なぜあなたはこれを嘲笑しようとしていますか? – davidism

+0

私はこの方法をテストするために嘲笑される必要があると仮定していました。また、いくつかのデータベース呼び出しがあります。これは、私が理解する限り、テストするために嘲笑される必要があります。この関数をどのようにテストするかのサンプルコードを私に教えてください。 – user2297790

答えて

1

Flask 0.8からは、テストクライアントのコンテキストでセッションを開き、それを変更するための適切な呼び出しをシミュレートする、いわゆる「セッショントランザクション」を提供します。テストファイルapp.py

from flask import Flask, session 

app = Flask(__name__) 
app.secret_key = 'very secret' 


@app.route('/friends', methods=['GET', 'POST']) 
def friends(): 
    test_val = session.get('uid') 
    if test_val is None: 
     return 'uid not in session' 
    else: 
     return 'uid in session' 


if __name__ == '__main__': 
    app.run(debug=True) 

test_app.py

import unittest 

from app import app 


class TestSession(unittest.TestCase): 
    def test_mocked_session(self): 
     with app.test_client() as c: 
      with c.session_transaction() as sess: 
       sess['uid'] = 'Bar' 
      # once this is reached the session was stored 
      rv = c.get('/friends') 
      assert rv.data == 'uid in session' 


if __name__ == '__main__': 
    unittest.main() 

python test_app.pyを経由してテストを実行

は、簡単な例を挙げてみましょう。

ドキュメント:Accessing and Modifying Sessions