为了账号安全,请及时绑定邮箱和手机立即绑定

为什么要在工厂功能上使用pytest工厂作为固定装置?

为什么要在工厂功能上使用pytest工厂作为固定装置?

肥皂起泡泡 2021-05-09 16:14:09
在py.test文档中,它描述了将工厂方法声明为fixture,例如:@pytest.fixturedef make_foo():    def __make_foo(name):        foo = Foo()        foo.name = name        return foo    return __make_foo与仅定义make_foo函数并使用它相比,这样做有什么好处/缺点?我不明白为什么它是固定装置。
查看完整描述

3 回答

?
慕标5832272

TA贡献1966条经验 获得超4个赞

实际上,最重要的优点是能够使用其他固定装置,并为您提供pytest的依赖项注入。另一个优点是允许您将参数传递给工厂,而这些参数在普通灯具中必须是静态的。


看这个例子:


@pytest.fixture

def mocked_server():

    with mock.patch('something'):

        yield MyServer()



@pytest.fixture

def connected_client(mocked_server):

    client = Client()

    client.connect_to(mocked_server, local_port=123)  # local_port must be static

    return client

现在,您可以编写一个获取的测试connected_client,但不能更改端口。如果您需要与多个客户进行测试该怎么办?你也不能。


如果您现在写:


@pytest.fixture

def connect_client(mocked_server):

    def __connect(local_port):

        client = Client()

        client.connect_to(mocked_server, local_port)

        return client

    return __connect

您可以编写接收connect_client工厂的测试,并调用它以在任何端口中获取初始化的客户端,以及需要多少次!


查看完整回答
反对 回复 2021-05-18
?
宝慕林4294392

TA贡献2021条经验 获得超8个赞

如果您有许多简单的工厂,则可以使用decorator简化它们的创建:


def factory_fixture(factory):

    @pytest.fixture(scope='session')

    def maker():

        return factory


    maker.__name__ = factory.__name__

    return maker



@factory_fixture

def make_stuff(foo, bar):

    return 'foo' + str(foo + bar)

这相当于


@pytest.fixture(score='session')

def make_stuff():

    def make(foo, bar):

        return 'foo' + str(foo + bar)

    return


查看完整回答
反对 回复 2021-05-18
  • 3 回答
  • 0 关注
  • 149 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信