Предположим, что у меня есть следующий сервисный объект:
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 вообще не должны поддразнивать? Есть ли какой-нибудь подход, который я могу использовать вместо насмешек?
Я уже просмотрел весь интернет, чтобы увидеть, как люди это делают, но мне не удалось найти каких-либо возможных решений.