gpt4 book ai didi

c# - 使用 Mock IDbSet 对 Entity Framework 进行单元测试

转载 作者:可可西里 更新时间:2023-11-01 09:13:06 26 4
gpt4 key购买 nike

我以前从未真正做过单元测试,而且我在第一次测试时跌跌撞撞。问题在于 _repository.Golfers.Count(); 始终指示 DbSet 为空。

我的测试很简单,我只是想添加一个新的高尔夫球手

[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()
};
}

我使用 Entity Framework 和代码优先构建了一个数据模型。我已经模拟了 IDbSet 的派生类以测试我的上下文(对网上的人行屈膝礼,我记不清了)

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
}

当我调试并逐步执行代码时,我可以看到我实例化了 _repository 并用三个假高尔夫球手填充了它,但是当我退出添加函数时,_respoistory。 Golfers 又是空的。当我添加一个新的高尔夫球手时,_set.Add(entity) 运行并添加了高尔夫球手,但 _respoistory.Golfers 还是空的。我在这里错过了什么?

更新

很抱歉我是个白痴,但我没有在我的MockGolfEntities 上下文中实现set。我没有的原因是我以前尝试过但无法弄清楚如何继续前进并忘记了它。那么,如何设置 IDbSet?这是我尝试过的方法,但它给了我一个 Stack Overflow 错误。我觉得自己像个白痴,但我不知道如何编写 set 函数。

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

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

最佳答案

您不需要实现 get/set,下面的代码应该足以为您生成上下文。

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

public IDbSet<Golfer> Golfers { get; set;}

}

我已经实现了您在原始帖子中的代码,一切似乎对我来说都运行良好 - 您从哪里获得 InMemoryDbSet 的源代码?我正在使用 NuGet package 1.3 ,也许你应该试试那个版本?

关于c# - 使用 Mock IDbSet 对 Entity Framework 进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11787968/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com