Предположим, у меня есть следующий служебный объект:
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 Client запускать запрос, он дает мне «немодельный» ответ. Другими словами, фактически вызывает исходный метод, предоставленный классом объекта службы, и выполняет вызовы API, что не должно выполняться. Однако, когда я создаю и запускаю сам класс ServiceObject, он правильно имитирует и возвращает массив ['baz', 'qux']
, не проходя через вызовы API.
Есть ли у кого-нибудь представление о том, что я делаю неправильно?
Или ответы клиента GraphQL вообще не надо высмеивать? Есть ли какой-нибудь подход, который я могу использовать вместо того, чтобы издеваться над ним?
Я уже просмотрел весь Интернет, чтобы узнать, как люди это делают, но мне не удалось найти никаких возможных решений.
Foo
или ваш производственный код не выполняет то, что вы думаете. Получитьpatch
правильно довольно сложно, издевательство намного проще, если вы используете инъекцию зависимостей. Кроме того, вы, похоже, тестируете в основном сторонний код. - person Stop harming Monica   schedule 22.01.2019