如何使用libgit2sharp和moq模拟分支?

时间:2016-05-04 21:21:20

标签: c# unit-testing tdd moq libgit2sharp

我需要检查我的命令方法的行为是否正确执行检出。为此,我试图嘲笑:

  • 存储库;
  • 两个分支;

这两个分支是一个成为当前分支,另一个是未来分支。

存储库将具有前面提到的两个分支,我将执行从一个分支到另一个分支的结账。

为此,我使用NSpec作为我的单元测试套件,moq作为我的模拟框架,libgit2sharp作为版本控制,fluentAssertions达到预期。

但这个(应该是)简单的任务对我来说更接近一个不可能的任务。我认为那是因为我在使用这些工具时缺乏深度(libgit2sharp和moq)。在来到这里之前,我在网上搜索了很多。所以,我认为这不是重复的问题。

我面临的一个问题是当我模拟(成功)一个存储库时,但是当我尝试添加分支时(通过调用repo.Branches.Addrepo.CreateBranch)我得到了被模拟的错误对象没有那些方法。它是正确的,因为它们是扩展方法,我发现moq有静态方法的问题。

嗯,就是这样:

如何使用libgit2sharp和moq模拟存在2个分支(其中一个是当前分支)的存储库,以便可以执行检出并从当前分支切换到另一个分支?

代码目前似乎是这样的:

    it["Executa mudança de branches"] = () =>
    {
        var repository = new Mock<IRepository>();
        repository.Setup(rp => rp.Branches.Add("confidence", "be3563ae3f795b2b4353bcce3a527ad0a4f7f644", false));
        repository.Setup(rp => rp.Branches.Add("goodDesign", "be3563ae3f795b2b4353bcce3a527ad0a4f7f645", false));

        repository.Object.CreateBranch("confidence", "be3563ae3f795b2b4353bcce3a527ad0a4f7f644");
        repository.Object.CreateBranch("goodDesign", "be3563ae3f795b2b4353bcce3a527ad0a4f7f645");

        repository.Object.Checkout(rep.Object.Branches["goodDesign"]);

        repository.Object.Head.Name.Should().Be("goodDesign");

        //my class in test 
        var versionControl = new VersionControl(repository);

        versionControl.ChangeToBranch("confidence");
        versionControl.CurrentBranch.Should().Be("confidence");

    };

并且,如果不可能使用这些工具。我该怎么办?

哦,我忘了说我不是英语母语人士,所以我真的很抱歉我在这里遇到的任何错误。

1 个答案:

答案 0 :(得分:0)

我很幸运,并包装了整个客户,所以我能够将Branches暴露为BracnCollection,而不是IEnumerable<Branch>

public IEnumerable<Branch> GetBranches() {
    return repository.Branches.AsEnumerable();
}

然后,您也可以模拟collection和Branch类。