2016-03-27 1 views
2

J'utilise la bouteille & gevent pour mon application python (2.7.6).Comment puis-je utiliser le test de simulation à l'intérieur du greenlet?

# -*- 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) 

Et je veux le tester avec 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) 

Mon test échoue.

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 

Il est de travail si j'utilise self.insert_event sans spawn. J'ai essayé d'utiliser patch.object, "avec" déclaration, mais sans succès ...

+0

Je pense qu'il y a une fausse duplication d'objet à l'intérieur du greenlet. –

+0

Votre échantillon m'aider à résoudre un problème, merci! – Heros

Répondre

1

J'ai trouvé une solution. J'ai besoin de simuler la méthode gevent.spawn. Parce que j'obtiens une réponse HTTP avant la fin de la coroutine. Ceci est ma solution:

@patch('my_app.app.db', db) 
@patch('my_app.app.spawn', 
     lambda method, *args, **kwargs: method(*args, **kwargs)) 
class TestViews(TestCase):