【问题标题】:Set an IQueryable property to return test data设置 IQueryable 属性以返回测试数据
【发布时间】:2012-12-30 07:53:32
【问题描述】:

我正在为我的 DAL 使用实体框架。我正在尝试使用 rhino mock 创建单元测试来测试我的存储库。我一直在尝试为类型为IQueryable<Restaurant> 的属性设置返回值。

当我运行单元测试时,我不断得到

Unit.Tests.Infrastructure.Repository.WhenInvoked.ShouldReturnAllRestaurants: System.InvalidOperationException:上一个方法 'IEnumerator.MoveNext();'需要返回值或抛出异常。

我的代码:

public interface IDbContext
{
    IQueryable<Restaurant> Restaurants { get; }
    IQueryable<Review> Reviews { get; }
    int SaveChanges();
    T Attach<T>(T entity) where T : class;
    T Add<T>(T entity) where T : class;
    T Delete<T>(T entity) where T : class; 
}

public class OdeToFoodDB : DbContext, IDbContext
{
    public DbSet<Restaurant> Restaurants { get; set; }
    public DbSet<Review> Reviews { get; set; }

    IQueryable<Restaurant> IDbContext.Restaurants
    {
        get { return Restaurants; }
    }

    IQueryable<Review> IDbContext.Reviews
    {
        get { return Reviews; }
    }

    int IDbContext.SaveChanges()
    {
        return SaveChanges(); 
    }

    T IDbContext.Add<T>(T entity)
    {
        return Set<T>().Add(entity); 
    }

    T IDbContext.Delete<T>(T entity)
    {
        return Set<T>().Remove(entity);
    }

    T IDbContext.Attach<T>(T entity)
    {
        var entry = Entry(entity);
        entry.State = System.Data.EntityState.Modified;
        return entity;
    }
}

public class RestaurantRepository : IRestaurantRepository
{
    private IDbContext _db;

    public RestaurantRepository()
    {
        _db = ObjectFactory.GetInstance<IDbContext>();
    }

    public RestaurantRepository(IDbContext db)
    {
        _db = db;
    }


    public List<Restaurant> GetAllRestaurants()
    {
        return _db.Restaurants.ToList(); 
    }
}

    [Test]
    public void ShouldReturnAllRestaurants()
    {
        _db.Stub(m => m.Restaurants.AsQueryable()).Return(_restaurant.AsQueryable());

        var sut = _restaurantRepository.GetAllRestaurants();
        //Some assert statement later. 
    }

【问题讨论】:

  • 通过单元测试对你有什么好处?我宁愿集成测试这个更简单,更有益
  • 我是 TDD 新手。我认为如果您使用 TDD 方法,每段代码都应该有一个单元测试。所以我想先为存储库编写单元测试。然后进行另一个实际上不使用mock来测试实际数据的集成测试是通过设置和拆除数据库从数据库中获取的。
  • 作为旁注。您根本不应该针对 IQueryables 进行测试。您测试的 IQueryable 与您在生产中使用的 IQueryable 之间的差异可能很大。您的生产 IQueryable 使用查询提供程序来查询数据库。查询数据库时可以使用的操作和类型受到限制。对于初学者,请参阅stackoverflow.com/questions/9354716/…。但是,您的测试是针对内存中的项目列表运行的,并且将使用另一个具有更多支持功能的查询提供程序。

标签: asp.net .net entity-framework rhino-mocks


【解决方案1】:

您可以只创建一个数组/集合等并使用 .AsQueryable()

【讨论】:

    【解决方案2】:

    我想出了答案。在 Rhino 中,当您尝试在 Stub() 方法中指定属性时,属性 Restaurants 不必是 .AsQuerable()。

        [Test]
        public void ShouldReturnAllRestaurants()
        {
            _db.Stub(m => m.Restaurants).Return(_restaurant.AsQueryable());
    
            var sut = _restaurantRepository.GetAllRestaurants();
            //Some assert statement later. 
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-30
      • 1970-01-01
      • 2023-03-10
      • 1970-01-01
      • 2012-10-01
      • 2012-06-24
      • 1970-01-01
      • 2014-08-16
      相关资源
      最近更新 更多