Mocking Queryables
Recently, we’ve been mocking out IQueryable’s as return values, which had led to setups that look like the following…</p>
programs.setup_result_for(x => x.All()).Return(new List<IProgram> {active_program,inactive_program}.AsQueryable());
I just switched over to the following syntax… by creating an extension method.
programs.setup_result_for(x => x.All()).will_return(active_program,inactive_program);
The following are the extensions methods to make this work.
public static IMethodOptions<IEnumerable<R>> will_return<R>(this IMethodOptions<IEnumerable<R>> options, params R[] items) { return options.Return(items); } public static IMethodOptions<IQueryable<R>> will_return<R>(this IMethodOptions<IQueryable<R>> options, params R[] items) { return options.Return(new Query<R>(items)); }
and…
internal class Query<T> : IQueryable<T> { private readonly IQueryable<T> query; public Query(params T[] items) { query = items.AsQueryable(); } public Expression Expression { get { return query.Expression; } } public Type ElementType { get { return query.ElementType; } } public IQueryProvider Provider { get { return query.Provider; } } public IEnumerator<T> GetEnumerator() { return query.GetEnumerator(); } IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); } }
Hope, this helps!