eugeniy / pytest-tornado

A py.test plugin providing fixtures and markers to simplify testing of asynchronous tornado applications.
Apache License 2.0
121 stars 34 forks source link

Mocking coroutine called on handler #59

Open lecardozo opened 4 years ago

lecardozo commented 4 years ago

I'm currently trying to mock a coroutine that is called inside the .get method of a handler. Let's call it, dummy_function.

from tornado.web import RequestHandler
from dummy import dummy_function

def Handler(RequestHandler):
    async def get(self):
        await dummy_function()

My initial approach for mocking this function was to apply the mock on the app fixture

from server.application import MyApplication

async def mocked_dummy():
    return []

@pytest.fixture
@patch("path.to.handler.dummy_function", mocked_dummy)
def app():
    return MyApplication()

@pytest.mark.gen_test
async def test_api(http_client, base_url):
   response = await http_client.fetch(base_url + "/endpoint")
   # run asserts...

When I run this, the patch doesn't work and the original dummy_function is not replaced. Is this the right approach?

Thanks!

dingyaguang117 commented 4 years ago

Please try

@pytest.mark.gen_test
async def test_api(http_client, base_url):
   with patch("path.to.handler.dummy_function", mocked_dummy):
     response = await http_client.fetch(base_url + "/endpoint")
   # run asserts...