これまでに単体テストを行ったことはありませんでした。私は最初のテストで遭遇してトリップしました。問題は、_repository.Golfers.Count();
が常にDbSet
が空であることを示していることです。ユニットテストEntity Framework with Mock IDbSet
私のテストは、私はちょうど私がEntity Frameworkのコードと、最初に使用したデータモデルを構築した新しいゴルファー
[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()
};
}
を追加しようとしている、シンプルです。私はデバッグし、コードをステップ実行するとき、私は私がインスタンス化することを確認でき
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
}
(私は正確に覚えていないことを、オンラインで人々にカーテシを)私のコンテキストをテストするためにIDbSetの派生クラスを嘲笑しました
_repository
と3人の偽装ゴルファーで記入してください。しかし、私が追加機能から抜け出すと、
_respoistory.Golfers
は再び空になります。新しいゴルファーを追加すると、
_set.Add(entity)
が実行され、ゴルファーが追加されますが、
_respoistory.Golfers
は空です。私はここで何が欠けていますか?
更新
私は馬鹿であることのために申し訳ありませんが、私は私のMockGolfEntities
文脈にset
を実施していませんでした。私が以前に試したことはありましたが、どうやって動いて、忘れてしまったのか、それを忘れていないのです。では、IDbSet
を設定するにはどうすればよいですか?これは私が試したことですが、それは私にスタックオーバーフローエラーを与えます。私は馬鹿のように感じますが、私は設定された機能を書く方法を理解することはできません。
public class MockGolfEntities : DbContext, IContext
{
public MockGolfEntities() {}
public IDbSet<Golfer> Golfers {
get {
return new InMemoryDbSet<Golfer>();
}
set {
this.Golfers = this.Set<Golfer>();
}
}
}
'set'メソッドは、' this.Golfers'に代入して自分自身を呼び出しています。値はどこかに格納する必要があります。例: 'this.golfers = value;'ここで 'golfers'はプライベートフィールドです(' private IDbSetゴルファー; ')。 –
Sam