Я использую .NET4.5
, EF6
и Moq
для модульных испытаний. Я пытаюсь объединить некоторые данные Db для теста. У меня есть пример того, как сделать это с объявляя mockset as variable and then using mocks.Mocking DbSet <T> inline
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();
есть способ объявить все это, как однострочник (так что я может передавать db-набор как 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>
инлайн?
EDIT: В отношении к дублированию ребят, которые отмечены на мой вопрос не прикладывают усилия читать дальше, чем титул, и получите зарин от Санта в этом году.
Попробуйте это http://www.loganfranken.com/blog/517/mocking-dbset-queries-in-ef6/ –
@VadimMartynov Привет, спасибо за ссылку, где в статье объявляются db set inline? –