2016-03-27 6 views
2

私のPython(2.7.6)アプリケーションには、& geventというボトルを使用しています。グリーンレット内のテストにモックを使用するにはどうしたらいいですか?

# -*- coding: utf-8 -*- 
from __future__ import unicode_literals 
from gevent import spawn, monkey 
from bottle import Bottle 
from .settings import MONGODB_HOST, MONGODB_PORT, MONGODB_NAME 

monkey.patch_all() 

mongo_client = MongoClient(MONGODB_HOST, MONGODB_PORT) 
db = mongo_client[MONGODB_NAME] 

class MyApp(object): 

    def insert_event(self): 
     data = {'a': self.a, 'b': self.b} # some data 
     db.events.insert(data) 

    def request(self): 
     # request data processing... 
     spawn(self.insert_event) 
     return {} 

app = Bottle() 
app.route('/', method='POST')(MyApp().request) 

そして、私はmongomock(https://github.com/vmalloc/mongomock)でそれをテストしたいです。

from __future__ import unicode_literals 
from unittest import TestCase 
from webtest import TestApp 
from mock import patch 
from mongomock import MongoClient 
from ..app import app as my_app 

db = MongoClient().db 

@patch('my_app.app.db', db) 
class TestViews(TestCase): 

    def setUp(self): 
     self.app = TestApp(ssp_app) 
     self.db = db 

    def test_request(self): 
     response = self.app.post('/', {}) 
     last_event = self.db.events.find_one({}) 
     self.assertTrue(last_event) 

私のテストは失敗します。

FAIL: test_request (my_app.tests.TestViews) 
---------------------------------------------------------------------- 
Traceback (most recent call last): 
    File "/usr/local/lib/python2.7/dist-packages/mock/mock.py", line 1305, in patched 
    return func(*args, **keywargs) 
    File "/srv/mysite/my_app/tests/views.py", line 71, in test_request 
    self.assertTrue(last_event) 
AssertionError: None is not true 

私はself.insert_eventをスポーンなしで使用するとうまくいきます。私はpatch.objectを "使って"ステートメントを使ってみましたが、成功しませんでした...

+0

グリーンレットの中にモックオブジェクト重複があると思います。 –

+0

あなたのサンプルは、問題を解決するのに役立ちます、ありがとう! – Heros

答えて

1

解決策が見つかりました。私はgevent.spawnメソッドを模倣する必要があります。なぜなら私はコルーチンが終了する前にHTTP応答を受け取るからです。この私の解決策:

@patch('my_app.app.db', db) 
@patch('my_app.app.spawn', 
     lambda method, *args, **kwargs: method(*args, **kwargs)) 
class TestViews(TestCase): 
関連する問題