如何使用pytest使用正确的参数调用函数?

时间:2015-02-25 10:40:26

标签: python unit-testing pytest

我正在学习如何使用py.test在Python中完成测试。我正在尝试测试在使用mock等其他库时非常常见的特定情况。具体来说,测试函数或方法是否使用正确的参数调用另一个callable。不需要返回值,只需确认被测方法正确调用即可。

以下是docs

的直接示例
>>> class ProductionClass:
...     def method(self):
...         self.something(1, 2, 3)
...     def something(self, a, b, c):
...         pass
...
>>> real = ProductionClass()
>>> real.something = MagicMock()
>>> real.method()
>>> real.something.assert_called_once_with(1, 2, 3)

是否可以使用monkeypatch或来自fixtures的{​​{1}}来执行此操作,而无需有效编写自己的模拟类?我搜索过这个特定用例,但无法找到一个例子。 py.test是否鼓励采用另类方式来执行此类代码?

2 个答案:

答案 0 :(得分:3)

您可以使用pytest-mock,这样可以轻松地将mock包用作pytest fixture。

答案 1 :(得分:1)

好。我提出了似乎有用的东西,但我认为它类似于模拟:

@pytest.fixture
def argtest():
    class TestArgs(object):
        def __call__(self, *args): 
            self.args = list(args)
    return TestArgs()

class ProductionClass:
    def method(self):
        self.something(1,2,3)
    def something(self, a, b, c):
        pass

def test_example(monkeypatch, argtest):
    monkeypatch.setattr("test_module.ProductionClass.something", argtest)
    real = ProductionClass()
    real.method()
    assert argtest.args == [1,2,3]