DAL에 Entity Framework를 사용하고 있습니다. 내 저장소를 테스트하기 위해 rhino mock을 사용하여 단위 테스트를 만들려고합니다. 유형이 IQueryable<Restaurant>
인 속성에 대한 반환 값을 설정하려고 시도했습니다.테스트 데이터를 반환하도록 IQueryable 속성을 설정하십시오.
내 단위 테스트를 실행할 때, 나는
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.
}
단위 테스트에서 얻을 수있는 것은 무엇입니까? 나는 오히려 더 간단하고 더 많은 혜택을 누리는 통합 테스트를하려고한다. – Marius
나는 TDD를 처음 사용했다. 나는 모든 코드 조각이 TDD 접근법을 사용한다면, 그것을위한 단위 테스트가 있어야한다고 생각했다. 그래서 저장소에 대한 단위 테스트를 먼저 작성하려고 생각했습니다. 그런 다음 실제 데이터를 테스트하기 위해 실제로 모의 (mock)를 사용하지 않는 또 다른 통합 테스트를 설정하려면 db를 설정하고 해체하여 데이터베이스에서 가져옵니다. –
사이드 노트로. IQueryables에 대해 전혀 테스트하지 않아야합니다. 테스트하는 IQueryable과 프로덕션 환경에서 사용하는 IQueryable의 차이는 아마도 엄청납니다. 프로덕션 IQueryable은 queryprovider를 사용하여 데이터베이스를 쿼리합니다. 데이터베이스를 쿼리 할 때 사용할 수있는 연산과 형식에는 제한이 있습니다. 처음에는 http://stackoverflow.com/questions/9354716/linq-to-ef-unsupported-functions를 참조하십시오. 그러나 테스트는 메모리 내 항목 목록에 대해 실행되며 지원되는 기능이 더 많은 다른 queryprovider가 사용됩니다. –