Last active
August 29, 2015 14:09
-
-
Save jwChung/664989d92a1b152159f4 to your computer and use it in GitHub Desktop.
FakeDbSet
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
namespace ArticleHarbor.DomainModel | |
{ | |
using System; | |
using System.Collections; | |
using System.Collections.Generic; | |
using System.Collections.ObjectModel; | |
using System.Data.Entity; | |
using System.Data.Entity.Infrastructure; | |
using System.Linq; | |
using System.Linq.Expressions; | |
using System.Threading; | |
using System.Threading.Tasks; | |
using Xunit; | |
public class FakeDbSet<T> : IDbSet<T>, IDbAsyncEnumerable<T> | |
where T : class | |
{ | |
private readonly ObservableCollection<T> data; | |
private readonly IQueryable query; | |
public FakeDbSet(IEnumerable<T> items) | |
{ | |
this.data = new ObservableCollection<T>(items); | |
this.query = this.data.AsQueryable(); | |
} | |
public ObservableCollection<T> Local | |
{ | |
get { return this.data; } | |
} | |
Type IQueryable.ElementType | |
{ | |
get { return this.query.ElementType; } | |
} | |
Expression IQueryable.Expression | |
{ | |
get { return this.query.Expression; } | |
} | |
IQueryProvider IQueryable.Provider | |
{ | |
get { return new TestDbAsyncQueryProvider<T>(this.query.Provider); } | |
} | |
public virtual T Find(params object[] keyValues) | |
{ | |
throw new NotImplementedException("Derive from FakeDbSet<T> and override Find"); | |
} | |
public T Add(T item) | |
{ | |
this.data.Add(item); | |
return item; | |
} | |
public T Remove(T item) | |
{ | |
this.data.Remove(item); | |
return item; | |
} | |
public T Attach(T item) | |
{ | |
this.data.Add(item); | |
return item; | |
} | |
public T Detach(T item) | |
{ | |
this.data.Remove(item); | |
return item; | |
} | |
public T Create() | |
{ | |
return Activator.CreateInstance<T>(); | |
} | |
public TDerivedEntity Create<TDerivedEntity>() where TDerivedEntity : class, T | |
{ | |
return Activator.CreateInstance<TDerivedEntity>(); | |
} | |
IEnumerator IEnumerable.GetEnumerator() | |
{ | |
return this.data.GetEnumerator(); | |
} | |
IEnumerator<T> IEnumerable<T>.GetEnumerator() | |
{ | |
return this.data.GetEnumerator(); | |
} | |
public IDbAsyncEnumerator<T> GetAsyncEnumerator() | |
{ | |
return new TestDbAsyncEnumerator<T>(this.data.GetEnumerator()); | |
} | |
IDbAsyncEnumerator IDbAsyncEnumerable.GetAsyncEnumerator() | |
{ | |
return this.GetAsyncEnumerator(); | |
} | |
} | |
internal class TestDbAsyncQueryProvider<TEntity> : IDbAsyncQueryProvider | |
{ | |
private readonly IQueryProvider inner; | |
internal TestDbAsyncQueryProvider(IQueryProvider inner) | |
{ | |
this.inner = inner; | |
} | |
public IQueryable CreateQuery(Expression expression) | |
{ | |
return new TestDbAsyncEnumerable<TEntity>(expression); | |
} | |
public IQueryable<TElement> CreateQuery<TElement>(Expression expression) | |
{ | |
return new TestDbAsyncEnumerable<TElement>(expression); | |
} | |
public object Execute(Expression expression) | |
{ | |
return this.inner.Execute(expression); | |
} | |
public TResult Execute<TResult>(Expression expression) | |
{ | |
return this.inner.Execute<TResult>(expression); | |
} | |
public Task<object> ExecuteAsync(Expression expression, CancellationToken cancellationToken) | |
{ | |
return Task.FromResult(this.Execute(expression)); | |
} | |
public Task<TResult> ExecuteAsync<TResult>(Expression expression, CancellationToken cancellationToken) | |
{ | |
return Task.FromResult(this.Execute<TResult>(expression)); | |
} | |
} | |
internal class TestDbAsyncEnumerable<T> : EnumerableQuery<T>, IDbAsyncEnumerable<T>, IQueryable<T> | |
{ | |
public TestDbAsyncEnumerable(IEnumerable<T> enumerable) | |
: base(enumerable) | |
{ | |
} | |
public TestDbAsyncEnumerable(Expression expression) | |
: base(expression) | |
{ | |
} | |
public IDbAsyncEnumerator<T> GetAsyncEnumerator() | |
{ | |
return new TestDbAsyncEnumerator<T>(this.AsEnumerable().GetEnumerator()); | |
} | |
IDbAsyncEnumerator IDbAsyncEnumerable.GetAsyncEnumerator() | |
{ | |
return this.GetAsyncEnumerator(); | |
} | |
IQueryProvider IQueryable.Provider | |
{ | |
get { return new TestDbAsyncQueryProvider<T>(this); } | |
} | |
} | |
internal class TestDbAsyncEnumerator<T> : IDbAsyncEnumerator<T> | |
{ | |
private readonly IEnumerator<T> inner; | |
public TestDbAsyncEnumerator(IEnumerator<T> inner) | |
{ | |
this.inner = inner; | |
} | |
public void Dispose() | |
{ | |
this.inner.Dispose(); | |
} | |
public Task<bool> MoveNextAsync(CancellationToken cancellationToken) | |
{ | |
return Task.FromResult(this.inner.MoveNext()); | |
} | |
public T Current | |
{ | |
get { return this.inner.Current; } | |
} | |
object IDbAsyncEnumerator.Current | |
{ | |
get { return this.Current; } | |
} | |
} | |
public class Art | |
{ | |
public int Id { get; set; } | |
public string Provider { get; set; } | |
public string No { get; set; } | |
public string Subject { get; set; } | |
public string Body { get; set; } | |
public DateTime Date { get; set; } | |
public string Url { get; set; } | |
} | |
public class FakeDbSetTest | |
{ | |
[Test] | |
public void DoesNotThrow() | |
{ | |
IEnumerable<Art> items = new[] { new Art(), new Art() }; | |
FakeDbSet<Art> articles = new FakeDbSet<Art>(items); | |
var test = articles.Select(x => x.Id).ToListAsync().Result; | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment