5

リモート Git リポジトリに対してクローンおよびプル機能を実行するために GitPython を使用している Python プロジェクトがあります。

簡単な例として:

import git
from git import Git
from git import Repo


def clone_and_checkout(full_dir, git_url, repo_ver):

    repo = Repo.clone_from(
        url=git_url,
        to_path=full_dir
    )

    # Trigger re-create if repository is bare
    if repo.bare:
        raise git.exc.InvalidGitRepositoryError

    # Set origin and pull
    origin = repo.remotes.origin
    origin.pull()

    # Check out desired version of repository
    g = Git(full_dir)
    g.checkout(repo_ver)

この関数の単体テストを記述できるようにしたいのですが、現状では明らかに外部システムに手を差し伸べる必要があります。

Mock を使用して HTTP 呼び出しをモックアップするのと同様の方法で、この外部インタラクションをモックアップした経験がある人がいるかどうかに興味があります。実際の G​​it リモートを呼び出す必要なく、テスト時にモックできる方法でこれらのタスクを実行できるようにしたいと考えています。

このためのテストを作成するにはどうすればよいですか?

編集:私が求めていることをより明確にするために、私はモックを初めて使用し、クラス自体ではなくこれらのクラスのインスタンスをモックする方法を理解するのに苦労していたことに言及する必要があります。私の質問は、「モックを使用してベアのようなインスタンス固有のプロパティを設定するにはどうすればよいですか?」という行に沿って、より適切に表現されているはずです。

それ以来、私はモックについて多くのことを学び、これを行う方法を理解したので、私自身の質問に対する答えを提供します.

4

1 に答える 1

4

これは、Mock の不完全な理解、または Patch メソッドの使用の一般的な結果のようです。

最初に行うことは、モックのドキュメントにある「パッチを適用する場所」セクションを読むことです。その情報があれば、 patch 関数を使用して、上記の関数で使用されている GitPython オブジェクトをモックできるはずです。これらのデコレーターは、単体テスト関数の上に表示されます。

@mock.patch('gitter.Repo')
@mock.patch('gitter.Git')

これらのモック化されたオブジェクトのいずれかのインスタンスに戻り値を提供するために、PropertyMockを使用できます。これを活用した単体テストの完全な例を次に示します。

import gitter  # file containing our clone function
import mock
import unittest


class test_gitter(unittest.TestCase):

    @mock.patch('gitter.Repo')
    @mock.patch('gitter.Git')
    def runTest(self, mock_git, mock_repo):

        # Set the "bare" attribute of the Repo instance to be False
        p = mock.PropertyMock(return_value=False)
        type(mock_repo.clone_from.return_value).bare = p

        gitter.clone_and_checkout(
            '/tmp/docker',
            'git@github.com:docker/docker.git',
            'master'
        )
        mock_git.checkout.called_once_with('master')
于 2015-09-06T21:51:19.477 に答える