1. 起首EF的Repository须要笼统的行动提到接口中。
比方 :
public interface IXXXContext : IDisposable { IXXXContext NewInstance(); // db sets DbSet<AAABBB> aaa { get; set; } ... // common Database Database { get; } DbContextConfiguration Configuration { get; } int SaveChanges(); Task<int> SaveChangesAsync(); // store pros ... IStorePro1 StorePro1 { get; } ... }
然后就能够运用DataContext和TestDataContext完成这个接口。个中TestDataContext是在UT中运用的,DataContext是自动生成的。
TestDataContext还须要以下几个类举行模仿。
public class TestDbSet<TEntity> : DbSet<TEntity>, IQueryable, IEnumerable<TEntity>, IDbAsyncEnumerable<TEntity> where TEntity : class { ObservableCollection<TEntity> _data; IQueryable _query; public TestDbSet() { _data = new ObservableCollection<TEntity>(); _query = _data.AsQueryable(); } public override TEntity Add(TEntity item) { _data.Add(item); return item; } public override TEntity Remove(TEntity item) { _data.Remove(item); return item; } public override TEntity Attach(TEntity item) { _data.Add(item); return item; } public override TEntity Create() { return Activator.CreateInstance<TEntity>(); } public override TDerivedEntity Create<TDerivedEntity>() { return Activator.CreateInstance<TDerivedEntity>(); } public override ObservableCollection<TEntity> Local { get { return _data; } } Type IQueryable.ElementType { get { return _query.ElementType; } } Expression IQueryable.Expression { get { return _query.Expression; } } IQueryProvider IQueryable.Provider { get { return new TestDbAsyncQueryProvider<TEntity>(_query.Provider); } } System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() { return _data.GetEnumerator(); } IEnumerator<TEntity> IEnumerable<TEntity>.GetEnumerator() { return _data.GetEnumerator(); } IDbAsyncEnumerator<TEntity> IDbAsyncEnumerable<TEntity>.GetAsyncEnumerator() { return new TestDbAsyncEnumerator<TEntity>(_data.GetEnumerator()); } } internal class TestDbAsyncQueryProvider<TEntity> : IDbAsyncQueryProvider { private readonly IQueryProvider _inner; internal TestDbAsyncQueryProvider(IQueryProvider inner) { _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 _inner.Execute(expression); } public TResult Execute<TResult>(Expression expression) { return _inner.Execute<TResult>(expression); } public Task<object> ExecuteAsync(Expression expression, CancellationToken cancellationToken) { return Task.FromResult(Execute(expression)); } public Task<TResult> ExecuteAsync<TResult>(Expression expression, CancellationToken cancellationToken) { return Task.FromResult(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 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) { _inner = inner; } public void Dispose() { _inner.Dispose(); } public Task<bool> MoveNextAsync(CancellationToken cancellationToken) { return Task.FromResult(_inner.MoveNext()); } public T Current { get { return _inner.Current; } } object IDbAsyncEnumerator.Current { get { return Current; } } }
运用示例:
[TestMethod] public void TestMethod1() { var mockSet = new Mock<DbSet<BLACKLISTED_TICKET>>(); var mockContext = new Mock<TicketDataContextTest>(); mockContext.Setup(m => m.BLACKLISTED_TICKET).Returns(new TestDbSet<BLACKLISTED_TICKET>()); var context = mockContext.Object; context.BLACKLISTED_TICKET.Add(new BLACKLISTED_TICKET() { TicketNumber = "aaa", CreatedDateTime = DateTime.Now, Id = 1, ModifiedDateTime = DateTime.Now, STATUS = "1" }); Assert.IsTrue(context.BLACKLISTED_TICKET.First().Id == 1); }
假如运用了存储历程,须要分外定义存储历程的接口。
比方:
IStorePro { ... } StorePro : IStorePro{ ... } StoreProFake: IStorePro{ }
然后IDataContext担任返回存储历程的实例
IDataContext{ ... IStorePro GetStorePro(); ... }
以上就是C# 解耦EntityFramework举行单元测试的内容,更多相关内容请关注ki4网(www.ki4.cn)!
上一篇:处理linux echo敕令以及linux echo敕令提醒权限不够的要领【Linux】,linux,echo,以及
下一篇:Linux集群/分布式环境下session处置惩罚要领引见【Linux】,session,Linux,分布式
支付宝扫一扫打赏
微信扫一扫打赏
共 0 条评论关于"C# 解耦EntityFramework举行单元测试【C#.Net教程】,C#,EntityFramework,单元测试"
最新评论