猿问

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

在py.test文档中,它描述了将工厂方法声明为fixture,例如:


@pytest.fixture

def make_foo():

    def __make_foo(name):

        foo = Foo()

        foo.name = name

        return foo

    return __make_foo

与仅定义make_foo函数并使用它相比,这样做有什么好处/缺点?我不明白为什么它是固定装置。


肥皂起泡泡
浏览 150回答 3
3回答

慕标5832272

实际上,最重要的优点是能够使用其他固定装置,并为您提供pytest的依赖项注入。另一个优点是允许您将参数传递给工厂,而这些参数在普通灯具中必须是静态的。看这个例子:@pytest.fixturedef mocked_server():    with mock.patch('something'):        yield MyServer()@pytest.fixturedef connected_client(mocked_server):    client = Client()    client.connect_to(mocked_server, local_port=123)  # local_port must be static    return client现在,您可以编写一个获取的测试connected_client,但不能更改端口。如果您需要与多个客户进行测试该怎么办?你也不能。如果您现在写:@pytest.fixturedef connect_client(mocked_server):    def __connect(local_port):        client = Client()        client.connect_to(mocked_server, local_port)        return client    return __connect您可以编写接收connect_client工厂的测试,并调用它以在任何端口中获取初始化的客户端,以及需要多少次!

宝慕林4294392

如果您有许多简单的工厂,则可以使用decorator简化它们的创建:def factory_fixture(factory):    @pytest.fixture(scope='session')    def maker():        return factory    maker.__name__ = factory.__name__    return maker@factory_fixturedef 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
随时随地看视频慕课网APP

相关分类

Python
我要回答