我想用NSubstitute通過模擬DbSet來單元測試Entity Framework 6.x。幸運的是,Scott Xu提供了一個很好的單元測試庫,EntityFramework.Testing.Moq使用Moq。所以,我修改了自己的代碼以適合NSubstitute,直到我想測試DbSet<T>.Add()
,DbSet<T>.Remove()
方法爲止,它的外觀一直很好。這裏是我的代碼位:使用DbSet處理對象<T>和IQueryable <T>使用NSubstitute返回錯誤
public static class NSubstituteDbSetExtensions
{
public static DbSet<TEntity> SetupData<TEntity>(this DbSet<TEntity> dbset, ICollection<TEntity> data = null, Func<object[], TEntity> find = null) where TEntity : class
{
data = data ?? new List<TEntity>();
find = find ?? (o => null);
var query = new InMemoryAsyncQueryable<TEntity>(data.AsQueryable());
((IQueryable<TEntity>)dbset).Provider.Returns(query.Provider);
((IQueryable<TEntity>)dbset).Expression.Returns(query.Expression);
((IQueryable<TEntity>)dbset).ElementType.Returns(query.ElementType);
((IQueryable<TEntity>)dbset).GetEnumerator().Returns(query.GetEnumerator());
#if !NET40
((IDbAsyncEnumerable<TEntity>)dbset).GetAsyncEnumerator().Returns(new InMemoryDbAsyncEnumerator<TEntity>(query.GetEnumerator()));
((IQueryable<TEntity>)dbset).Provider.Returns(query.Provider);
#endif
...
dbset.Remove(Arg.Do<TEntity>(entity =>
{
data.Remove(entity);
dbset.SetupData(data, find);
}));
...
dbset.Add(Arg.Do<TEntity>(entity =>
{
data.Add(entity);
dbset.SetupData(data, find);
});
...
return dbset;
}
}
我創建了一個測試方法,如:
[TestClass]
public class ManipulationTests
{
[TestMethod]
public void Can_remove_set()
{
var blog = new Blog();
var data = new List<Blog> { blog };
var set = Substitute.For<DbSet<Blog>, IQueryable<Blog>, IDbAsyncEnumerable<Blog>>()
.SetupData(data);
set.Remove(blog);
var result = set.ToList();
Assert.AreEqual(0, result.Count);
}
}
public class Blog
{
...
}
當測試方法調用set.Remove(blog)
的問題就出現了。它拋出一個InvalidOperationException
帶有錯誤信息
收集被修改;枚舉操作可能不會執行。
這是因爲,當set.Remove(blog)
方法被稱爲假data
對象已被修改。但是,原來斯科特使用Moq
的方式並不會導致問題。
因此,我包裹set.Remove(blog)
方法與try ... catch (InvalidOperationException ex)
塊,讓catch
塊什麼都不做,那麼測試不拋出(當然)一個例外,如預期那樣獲得通過。
我知道這不是解決方案,但我怎樣才能實現我的目標,以單元測試DbSet<T>.Add()
和DbSet<T>.Remove()
方法?
@@ Frank Ahh,對不起。我剛從假期回來。 :-)它就像一個魅力!我應該更多地瞭解lambda表達式。謝謝! – JustInChronicles 2014-12-29 04:27:52