Unit Testing Entity Framework mit Mock IDbSet

Ich habe noch nie Unit-Tests durchgeführt und bin bei meinem ersten Test gestolpert und gestolpert. Das Problem ist, dass die_repository.Golfers.Count(); zeigt immer an, dass dieDbSet ist leer.

Mein Test ist einfach, ich versuche nur, einen neuen Golfer hinzuzufügen

[TestClass]
public class GolferUnitTest //: GolferTestBase
{
    public MockGolfEntities _repository;

    [TestMethod]
    public void ShouldAddNewGolferToRepository()
    {
        _repository = new MockGolfEntities();

        _repository.Golfers = new InMemoryDbSet<Golfer>(CreateFakeGolfers());

        int count = _repository.Golfers.Count();
        _repository.Golfers.Add(_newGolfer);

        Assert.IsTrue(_repository.Golfers.Count() == count + 1);
    }

    private Golfer _newGolfer = new Golfer()
    {
        Index = 8,
        Guid = System.Guid.NewGuid(),
        FirstName = "Jonas",
        LastName = "Persson"
    };
    public static IEnumerable<Golfer> CreateFakeGolfers()
    {
        yield return new Golfer()
        {
            Index = 1,
            FirstName = "Bill",
            LastName = "Clinton",
            Guid = System.Guid.NewGuid()
        };
        yield return new Golfer()
        {
            Index = 2,
            FirstName = "Lee",
            LastName = "Westwood",
            Guid = System.Guid.NewGuid()
        };
        yield return new Golfer()
        {
            Index = 3,
            FirstName = "Justin",
            LastName = "Rose",
            Guid = System.Guid.NewGuid()
        };
    }

Ich habe ein Datenmodell mit Entity Framework und Code-First erstellt. Ich habe eine abgeleitete Klasse für IDbSet verspottet, um meinen Kontext zu testen.

public class InMemoryDbSet<T> : IDbSet<T> where T : class
{
    readonly HashSet<T> _set;
    readonly IQueryable<T> _queryableSet;

    public InMemoryDbSet() : this(Enumerable.Empty<T>()) { }

    public InMemoryDbSet(IEnumerable<T> entities)
    {
        _set = new HashSet<T>();

        foreach (var entity in entities)
        {
            _set.Add(entity);
        }

        _queryableSet = _set.AsQueryable();
    }

    public T Add(T entity)
    {
        _set.Add(entity);
        return entity;

    }

    public int Count(T entity)
    {
        return _set.Count();
    }

    // bunch of other methods that I don't want to burden you with
}

Wenn ich debugge und durch den Code gehe, sehe ich, dass ich das instanziiere_repository und fülle es mit drei gefälschten Golfspielern, aber wenn ich aus der Zusatzfunktion aussteige, wird die_respoistory.Golfers ist wieder leer. Wenn ich einen neuen Golfer hinzufüge, den_set.Add(entity) Läuft und der Golfer kommt hinzu, aber nochmal_respoistory.Golfers ist leer. Was vermisse ich hier?

Aktualisieren

Es tut mir leid, dass ich ein Idiot bin, aber ich hatte das nicht implementiertset auf meinemMockGolfEntities Kontext. Der Grund, warum ich es nicht hatte, war, dass ich es zuvor versucht hatte, aber nicht herausfinden konnte, wie es weiterging und es vergessen hatte. Also, wie stelle ich ein?IDbSet? Dies ist, was ich versucht habe, aber es gibt mir einen Stapelüberlauffehler. Ich fühle mich wie ein Idiot, aber ich kann nicht herausfinden, wie man die Set-Funktion schreibt.

public class MockGolfEntities : DbContext, IContext
{
    public MockGolfEntities() {}

    public IDbSet<Golfer> Golfers { 
        get {
            return new InMemoryDbSet<Golfer>();
        }
        set {
            this.Golfers = this.Set<Golfer>();
        }
    }
}

Antworten auf die Frage(1)

Ihre Antwort auf die Frage