2016-03-27 6 views
2

Я использую бутылку & gevent для моего приложения python (2.7.6).Как я могу использовать mock для тестирования внутри 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) 

И я хочу, чтобы проверить его с 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

Я думаю, что есть дублированный объект, дублирующий внутри greenlet. –

+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):