Welcome to mirror list, hosted at ThFree Co, Russian Federation.

MockedRepositoryFixture.cs « LibGit2Sharp.Tests - github.com/mono/libgit2sharp.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: eb552f82379a78102f0dd365ed531c24562fcf4a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
using System.Collections.Generic;
using System;
using System.Linq;
using LibGit2Sharp.Tests.TestHelpers;
using Xunit;
using Moq;

namespace LibGit2Sharp.Tests
{
    // This fixture shows how one can mock the IRepository when writing an application against LibGit2Sharp.
    // The application we want to test is simulated by the CommitCounter class (see below), which takes an IRepository,
    // and whose role is to compute and return the number of commits in the given repository.
    public class MockedRepositoryFixture : BaseFixture
    {
        // In this test, we pass to CommitCounter a concrete instance of the Repository. It means we will end up calling the concrete Repository
        // during the test run.
        [Fact]
        public void CanCountCommitsWithConcreteRepository()
        {
            using (var repo = new Repository(BareTestRepoPath))
            {
                var commitCounter = new CommitCounter(repo);
                Assert.Equal(7, commitCounter.NumberOfCommits);
            }
        }

        // This test shows that CommitCounter can take a mocked instance of IRepository. It means we can test CommitCounter without
        // relying on the concrete repository. We are testing CommitCounter in isolation.
        [Fact]
        public void CanCountCommitsWithMockedRepository()
        {
            var commitLog = Mock.Of<CommitLog>(cl => cl.GetEnumerator() == FakeCommitLog(17));
            var repo = Mock.Of<IRepository>(r => r.Commits == commitLog);

            var commitCounter = new CommitCounter(repo);
            Assert.Equal(17, commitCounter.NumberOfCommits);
        }

        private static IEnumerator<Commit> FakeCommitLog(int size)
        {
            for (int i = 0; i < size; i++)
            {
                yield return FakeCommit(Guid.NewGuid().ToString());
            }
        }

        private static Commit FakeCommit(string sha)
        {
            var commitMock = new Mock<Commit>();
            commitMock.SetupGet(x => x.Sha).Returns(sha);

            return commitMock.Object;
        }

        // Simulated external application ;)
        private class CommitCounter
        {
            private readonly IRepository repo;

            public CommitCounter(IRepository repo)
            {
                this.repo = repo;
            }

            public int NumberOfCommits
            {
                get { return repo.Commits.Count(); }
            }
        }
    }
}