【发布时间】:2015-12-17 10:52:27
【问题描述】:
我正在使用.NET4.5、EF6 和Moq 进行单元测试。我正在尝试模拟一些 Db 数据进行测试。我有一个示例如何通过声明 mockset as variable and then using mocks.
public static class TestExtensionMethods
{
public static DbSet<T> AsDbSet<T>(this List<T> sourceList) where T : class
{
var queryable = sourceList.AsQueryable();
var dbSet = new Mock<DbSet<T>>();
dbSet.As<IQueryable<T>>().Setup(m => m.Provider).Returns(queryable.Provider);
dbSet.As<IQueryable<T>>().Setup(m => m.Expression).Returns(queryable.Expression);
dbSet.As<IQueryable<T>>().Setup(m => m.ElementType).Returns(queryable.ElementType);
dbSet.As<IQueryable<T>>().Setup(m => m.GetEnumerator()).Returns(queryable.GetEnumerator());
dbSet.Setup(d => d.Add(It.IsAny<T>())).Callback<T>(sourceList.Add);
return dbSet.Object;
}
}
我将它用作扩展方法 ATM,例如:mockedDbContext.Journey = new List<Journey> { }.AsDbSet();
有没有办法将其全部声明为单行(这样我就可以将数据库集传递为TestCaseData 而无需编写扩展方法)。我试过了
var mockedDbContext = new Mock<OnlineLegal>();
mockedDbContext.Setup(o => o.Journey).Returns(() => (DbSet<Journey>)(new List<Journey> { new Journey { SessionId = sessionId, ConveyancingAnswer = new Collection<ConveyancingAnswer>()} }.AsEnumerable()));
但它被System.InvalidCastException : Unable to cast object of type 'System.Collections.Generic.List1[Saga.Services.Legal.Website.Journey]' to type 'System.Data.Entity.DbSet1[Saga.Services.Legal.Website.Journey]'.炸毁了
如何模拟DbSet<T> inline?
编辑:关于重复,标记我的问题的人除了标题之外没有花更多的精力阅读,今年将从圣诞老人那里得到沙林毒气。
【问题讨论】:
-
@VadimMartynov 嗨,感谢您提供的链接,他们在文章中声明 db set inline 的位置?
-
替代方法 - 不要模拟 DBContext ;)
标签: c# unit-testing entity-framework-6 moq dbset