gpt4 book ai didi

c# - 具有上下文的模拟通用存储库

转载 作者:行者123 更新时间:2023-12-02 18:18:20 24 4
gpt4 key购买 nike

我有一个适用于多个上下文的通用存储库。我可以毫无问题地扩展它并将其用于服务。但是,当我模拟它时,构造函数中的 this.Entities 始终为 null

通用数据存储库

public class GenericDataRepository<T, C> : IGenericDataRepository<T, C> where T : class where C : DbContext, new() {

protected C context;
protected IDbSet<T> Entities;

public GenericDataRepository() {
this.context = new C();
this.Entities = context.Set<T>();
}

public GenericDataRepository(C context) {
this.context = context;
this.Entities = context.Set<T>(); // Problem is here. Entities didn't get set when mocking
}

public virtual IEnumerable<T> FindBy(Expression<Func<T, bool>> predicate) {
return Entities.Where(predicate).ToList();
}

// omitted Add, Update, Delte
}

单元测试

 [Test]
public void GetBIlloTo() {
var data = new List<BillTo> {
new BillTo { CONTACTID = 12, COUNTRY = "USA" }
}.AsQueryable();

var mockSet = Substitute.For<DbSet<BillTo>, IQueryable<BillTo>>();

((IQueryable<BillTo>)mockSet).Provider.Returns(data.Provider);
((IQueryable<BillTo>)mockSet).Expression.Returns(data.Expression);
((IQueryable<BillTo>)mockSet).ElementType.Returns(data.ElementType);
((IQueryable<BillTo>)mockSet).GetEnumerator().Returns(data.GetEnumerator());

var mockContext = Substitute.For<MyEntities>();
mockContext.BillToes.Returns(mockSet);
var repo = new GenericDataRepository<BillTo, MyEntities>(mockContext);

//// Act
var actual = repo.FindBy(r => r.CONTACTID == 12);

//// Assert
Assert.AreEqual(actual.Count(), 1);
}

MyEntities - 由 EF 生成,我没有更改它。

 public partial class MyEntities : DbContext
{
public MyEntities()
: base("name=MyEntities")
{
}

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
throw new UnintentionalCodeFirstException();
}

public virtual DbSet<BillTo> BillToes { get; set; }
}

我首先使用 EF 数据库、NUnit 和 Nsubstitute。也尝试过起订量,同样的问题。那么,为什么Entities没有被设置呢?

最佳答案

您没有使用方法 set<T> 将模拟对象设置为返回任何值.

只需在初始化测试类之前添加以下调用:

mockContext.Set<BillTo>().Returns(mockSet);

关于c# - 具有上下文的模拟通用存储库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36266204/

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