Ложный ответ для распознавателя запросов GraphQL из ServiceObject для предотвращения вызовов API в UnitTests - PullRequest
0 голосов
/ 21 января 2019

Предположим, что у меня есть следующий сервисный объект:

class Foo(object):
    def bar(self):
        return ['foo', 'bar']

А это схема:

import Foo

class Query(graphene.ObjectType):
    bar = graphene.List(lambda: graphene.String)

    def resolve_bar(self, info):
        return Foo().bar()

Я пытаюсь проверить, правильно ли схема GraphQL вызывает метод bar в обработчике запросов. Итак, у нас есть этот кусок кода в тестах:

from MySchema import Query

class TestFooBar(unittest.TestCase):
    @patch('Foo')
    def test_bar(self, mock_foo):
        mock_foo.return_value.bar.return_value = ['baz', 'qux']

        my_schema = graphene.Schema(query=Query)
        client = Client(self.my_schema)

        query = '''
            query {
                bar()
            }
        '''
        executed = self.client.execute(query)

       #some attributes that I want to assert
       assertTrue(mock_foo.called) # returns False

Почему я использую насмешки?

В исходном классе ServiceObject он выполняет некоторые вызовы API для другой службы, которая уже тестируется изолированно. И в этом случае я хочу только проверить, вызывает ли запрос GraphQL bar метод, который вернет предполагаемый объект.

Проблема

Когда я высмеиваю ответ, который возвращает сервисный объект, как в приведенном выше коде, и заставляю тест клиента Graphene выполнить запрос, он дает мне «немодальный» ответ. Другими словами, фактически вызывает оригинальный метод, предоставленный классом объекта службы, и вызывает API-вызовы , которые не должны выполняться . Однако, когда я создаю экземпляр и запускаю сам класс ServiceObject, он корректно проверяется и возвращает массив ['baz', 'qux'], не проходя через вызовы API.

Есть ли у кого-то представления о том, что я делаю неправильно?

Или ответы GraphQL Client вообще не должны поддразнивать? Есть ли какой-нибудь подход, который я могу использовать вместо насмешек?

Я уже просмотрел весь интернет, чтобы увидеть, как люди это делают, но мне не удалось найти каких-либо возможных решений.

1 Ответ

0 голосов
/ 22 января 2019

Итак, проблема в следующем:

Мой patch не так. Я должен исправить патч, а не сайт определения. В этом случае это будет: @patch('MySchema.Foo') для выполнения насмешки над местом вызова.

Доказать, что

from MySchema import Query

class TestFooBar(unittest.TestCase):
    @patch('MySchema.Foo')
    def test_bar(self, mock_foo):
        mock_foo.return_value.bar.return_value = ['baz', 'qux']

        my_schema = graphene.Schema(query=Query)
        client = Client(self.my_schema)

        query = '''
            query {
                bar()
            }
        '''
        executed = self.client.execute(query)

        assertTrue(mock_foo().bar.called) # now returns True

Спасибо jkimbo , которые пришли на помощь, когда я спросил в репозитории Graphene-Python Github .

...