我正在自動化一些存儲庫操作,并且正在使用GitPython來完成這項工作。讓我們簡化事情并假設我想斷言我的函數(shù)是否pull在存儲庫上調用了method。代碼如下:from pytest_mock import MockFixturefrom git import Git, Reporepo = Repo('/Users/Jatimir/path/to/repo')def pull() -> None: repo.git.pull()但是,我注意到Git該類有些特殊,沒有實現(xiàn)pull。相反,它將“委派”所有__getattr__使用另一種方法完成工作的流量。def __getattr__(self, name): ... return lambda *args, **kwargs: self._call_process(name, *args, **kwargs)我的問題是如何進行測試?我正在使用pytest和提供測試裝置的pytest-mock,mocker這是我的嘗試:def test_pull1(mocker: MockFixture) -> None: pull_mock = mocker.MagicMock(name='pull') getattr_mock = mocker.MagicMock(name='__getattr__', return_value=pull_mock) mocker.patch.object(Git, '__getattr__', getattr_mock) pull() pull_mock.assert_called_once_with()def test_pull2(mocker: MockFixture) -> None: pull_mock = mocker.Mock(name='pull') def __getattr__(self, name): if name == 'pull': return pull_mock mocker.patch.object(Git, '__getattr__', __getattr__) pull() pull_mock.assert_called_once_with()它們都可以工作,但是我覺得有更好的方法,也許我測試這種方法是錯誤的。
從__getattr__方法檢索的模擬函數(shù)
慕尼黑8549860
2021-03-29 13:11:13