我正在为我的DAL使用Entity Framework。我正在尝试使用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.
}
答案 0 :(得分:0)
您可以创建数组/集合等并使用.AsQueryable()
答案 1 :(得分:0)
我找到了答案。在Rhino中,当您尝试在Stub()方法中指定属性时,属性Restaurants不必是.AsQuerable()。
[Test]
public void ShouldReturnAllRestaurants()
{
_db.Stub(m => m.Restaurants).Return(_restaurant.AsQueryable());
var sut = _restaurantRepository.GetAllRestaurants();
//Some assert statement later.
}