首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在测试时,不向上下文添加实体

在测试时,不向上下文添加实体
EN

Stack Overflow用户
提问于 2016-03-30 14:17:45
回答 1查看 1.1K关注 0票数 1

我第一次用EF和书写单元测试创建了一个GenericRepository。GetAll()Update()的测试通过了,但是Add()Delete()失败了。为什么它不是Add?我把头发拔了出来,因为这是一行代码,我搞不懂。我先用EF数据库,Nunit,N替代品。

欢迎任何建议。

代码语言:javascript
复制
public class GenericDataRepository<T, C> : IGenericDataRepository<T, C> where T : class where C : DbContext, new() {

    protected C _context;
    protected IDbSet<T> _dbSet;

    public GenericDataRepository() {
        _context = new C();
        _dbSet = _context.Set<T>();
    }

    public GenericDataRepository(C context) {
        _context = context;
        _dbSet = context.Set<T>();
    }

    public virtual IQueryable<T> GetAll() {
        return _dbSet.AsQueryable<T>();
    }

    public virtual T Add(T entity) {
        return _dbSet.Add(entity);
    }

    public virtual void Update(T entity) {
        _context.Entry(entity).State = EntityState.Modified;
    }

    public virtual T Delete(T entity) {
        return _dbSet.Remove(entity);
    }

    public virtual void Save() {
        _context.SaveChanges();
    }

}

MyEntities

代码语言:javascript
复制
public partial class MyEntities : DbContext{
public MyEntities()
    : base("name=MyEntities")
{
}

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

public virtual DbSet<Customer> Cusotmers{ get; set; }

测试

代码语言:javascript
复制
 public static class NSubstituteUtils {
    public static DbSet<T> CreateMockDbSet<T>(IQueryable<T> data = null)
        where T : class {
        var mockSet = Substitute.For<DbSet<T>, IQueryable<T>>();
        mockSet.AsNoTracking().Returns(mockSet);

        if (data != null) {
            var queryable = data.AsQueryable();

            // setup all IQueryable methods using what you have from "data"
            ((IQueryable<T>)mockSet).Provider.Returns(data.Provider);
            ((IQueryable<T>)mockSet).Expression.Returns(data.Expression);
            ((IQueryable<T>)mockSet).ElementType.Returns(data.ElementType);
            ((IQueryable<T>)mockSet).GetEnumerator().Returns(data.GetEnumerator());
        }

        return mockSet;
    }
}

static IQueryable<Customer> data;
[SetUp]
    public void Init() {
        data = new List<Customer> {
            new Customer {
                CUSTOMER = "333",
                CUSTOMERNAME = "no name"
            },
            new Customer {
                CUSTOMER = "555",
                CUSTOMERNAME = "test name"
            }
        }.AsQueryable();
    }
[Test]
    public void Add_Should_AddGenericT() {

        var mockSet = NSubstituteUtils.CreateMockDbSet<Customer>(data);
        var mockContext = Substitute.For<MyEntities>();
        mockContext.Set<Customer>().Returns(mockSet);

        var repo = new GenericDataRepository<Customer, MyEntities>(mockContext);

        var customer = new Customer {
            CUSTOMER1 = "123",
            CUSTOMERNAME = "test name"
        };
        var result = repo.Add(customer);        // issue here: result returns null which should be a Customer
        repo.Save();

        var customerList = repo.GetAll().ToList();
        Assert.AreEqual(3, customerList.Count); // failed. Expected 3 but was 2
    }
EN

回答 1

Stack Overflow用户

发布于 2016-03-30 15:06:18

您马上将数据变量定义为IQueryable,并使用它在存储库中模拟_dbSet。

代码语言:javascript
复制
 data = new List<Customer> {
        new Customer {
            CUSTOMER = "333",
            CUSTOMERNAME = "no name"
        },
        new Customer {
            CUSTOMER = "555",
            CUSTOMERNAME = "test name"
        }
    }.AsQueryable();

因此,在执行.Add()时,实际上是向IQueryable添加,这是一个只读接口。

从数据定义中删除AsQueryable()并使用实际列表。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36311600

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档