Python 从ServiceObject模拟GraphQL查询解析器的响应以防止UnitTests中的API调用

Python 从ServiceObject模拟GraphQL查询解析器的响应以防止UnitTests中的API调用,python,automated-tests,graphql,graphene-python,Python,Automated Tests,Graphql,Graphene Python,假设我有以下服务对象: 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() 我试图测试

假设我有以下服务对象:

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
为什么我要使用mock? 在原始ServiceObject类中,它对另一个服务进行一些API调用,该服务已经以隔离的方式进行了测试。在本例中,我只想测试GraphQL查询
bar
是否正在调用一个将返回其假定对象的方法

问题 当我模拟服务对象返回的响应(如上述代码所示)并让Graphene客户端测试运行查询时,它会给出“非模拟”响应。换句话说,它实际上是调用服务对象类提供的原始方法并进行API调用,不应该执行。但是,当我实例化并运行ServiceObject类本身时,它被正确模拟并返回
['baz','qux']
数组,而不是通过API调用

有人知道我做错了什么吗? 或者GraphQL客户端响应根本不应该被嘲笑?有什么方法可以代替嘲笑它吗

我已经在互联网上到处寻找人们是如何做到这一点的,但我找不到任何可能的解决方案。

所以,问题是: 我的
补丁
错误。我应该修补callsite,而不是definition站点。在本例中,将是:
@patch('MySchema.Foo')
来完成对调用站点的模拟

证明
多亏了jkimbo,当我在报告中询问时,他帮助了我。

如果你不试图模仿石墨烯,就有可能用石墨烯编写成功的测试——例如,如果你没有一个。这可能是因为您修补了错误的
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