ShadyBears
ShadyBears

Reputation: 4185

How to Mock a flask-restful class with kwargs

From Intermediate-Usage Flask-RESTful 0.3.7 documentation in the Passing Constructor Parameters Into Resources section at the bottom, how would you write a test in order to mock kwargs? Side note: I tweaked it so the Smart Engine class is passed directly rather than being instantiated to a variable then passed.

from flask_restful import Resource

class TodoNext(Resource):
    def __init__(self, **kwargs):
        # smart_engine is a black box dependency
        self.smart_engine = kwargs['smart_engine']

    def get(self):
        return self.smart_engine.next_todo()

You can inject the required dependency into TodoNext like so:

api.add_resource(TodoNext, '/next',
    resource_class_kwargs={ 'smart_engine': SmartEngine() })

Test class in question:

import unittest

class TestTodoNext(unittest.TestCase):
    todo_next_instance = TodoNext() # How would you mock smart_engine in this case?

Upvotes: 0

Views: 364

Answers (1)

stasiekz
stasiekz

Reputation: 1863

You can use Mock object from unittest.mock to mock smart_engine.

import unittest
from unittest.mock import Mock

class TestTodoNext(unittest.TestCase):
    smart_engine = Mock()
    smart_engine.next_todo.return_value = "YOUR DESIRED RETURN VALUE"
    todo_next_instance = TodoNext(smart_engine=smart_engine)
    self.assertEqual(todo_next_instace.get(), "YOUR DESIRED RETURN VALUE")

Upvotes: 1

Related Questions