从 pytest fixture 返回多个对象

新手上路,请多包涵

我正在通过测试一个简单的事件发射器实现来学习如何使用 pytest。

基本上,它看起来像这样

class EventEmitter():
    def __init__(self):
        ...
    def subscribe(self, event_map):
        # adds listeners to provided in event_map events
    def emit(self, event, *args):
        # emits event with given args

为了方便起见,我创建了一个 Listener 用于测试的类

class Listener():
    def __init__(self):
        ...
    def operation(self):
        # actual listener

目前,测试看起来像以下方式

@pytest.fixture
def event():
    ee = EventEmitter()
    lstr = Listener()
    ee.subscribe({"event" : [lstr.operation]})
    return lstr, ee

def test_emitter(event):
    lstr = event[0]
    ee = event[1]
    ee.emit("event")
    assert lstr.result == 7 # for example

为了测试事件发射器,我需要检查事件传播后监听器的内部状态是否发生了变化。因此,我需要两个对象,我想知道是否有更好的方法来做到这一点(也许使用两个固定装置而不是一个固定装置)因为这对我来说看起来有点丑陋。

原文由 Zallin 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 488
2 个回答

在这种情况下,您可能需要两个固定装置。

你可以尝试 @pytest.yield_fixture 像:

 @pytest.yield_fixture
def event():
    ...
    yield <event_properties>

@pytest.yield_fixture
def listener(event):
    ...
    yield <listener_properties>


注意: 现在已弃用 https://docs.pytest.org/en/latest/yieldfixture.html

原文由 Ederson Badeca 发布,翻译遵循 CC BY-SA 4.0 许可协议

通常为了避免 tuples 并美化您的代码,您可以将它们作为一个类重新组合成一个单元,这已经为您完成,使用 collections.namedtuple

 import collections
EventListener = collections.namedtuple('EventListener', 'event listener')

现在修改你的夹具:

 @pytest.fixture
def event_listener():
 e = EventListener(EventEmitter(), Listener())
 e.event.subscribe({'event' : [e.listener.operation]})
 return e

现在修改你的测试:

 def test_emitter(event_listener):
 event_listener.event.emit('event')
 assert event_listener.listener.result == 7

原文由 Sawel 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题