2016-11-15 1 views
3

Я хотел бы модульное тестирование DbContext, который наследует от IdentityDbContextMOq: Свойство правильно установлено как виртуальные, но все еще имеет недопустимую установку на невиртуальный члене

я получаю сообщение об ошибке в NotSupportedException с очень распространенное сообщение:

System.NotSupportedException: Invalid установка на невиртуальный (переопределение в VB) член

Чтобы найти некоторые подсказки я уже повторно объявление кучу сообщений. Вот некоторые примеры:

Очевидно, что решение, как представляется, установить dbSet в качестве виртуального. Что я наделал.

Невероятно, ошибка остается.

Вот мой IdentityDataContext:

public class IdentityDataContext : IdentityDbContext<ApplicationUser> 
{  
    public virtual DbSet<Search> Searches { get; set; } 

    public IdentityDataContext() 
     : base("LocalDb", 
       throwIfV1Schema: true) 
    {    
    } 

    public static IdentityDataContext Create() 
    { 
     return new IdentityDataContext(); 
    } 
} 

Вот мой Поиск ПОКО:

public class Search : BaseEntity 
{ 
    //BaseEntity is just an abstract class with createdAt,Id,updatedAt property 
    public string ConsumerIdentifier { get; set; } 
    public string LanguageCode { get; set; }   
} 

Наконец вот мой Set Up Method:

[TestInitialize] 
public void SetupTest() 
{ 
    //DataInitializer.GetAllSearches() returns a List of "Search" 

    _searches = DataInitializer.GetAllSearches(); 

    var dbSet = new Mock<DbSet<Search>>(); 
    dbSet.As<IQueryable<Search>>().Setup(m => m.Provider).Returns(_searches.AsQueryable().Provider); 
    dbSet.As<IQueryable<Search>>().Setup(m => m.Expression).Returns(_searches.AsQueryable().Expression); 
    dbSet.As<IQueryable<Search>>().Setup(m => m.ElementType).Returns(_searches.AsQueryable().ElementType); 
    dbSet.As<IQueryable<Search>>().Setup(m => m.GetEnumerator()).Returns(_searches.AsQueryable().GetEnumerator()); 
    dbSet.Setup(d => d.Add(It.IsAny<Search>())).Callback<Search>(_searches.Add); 

    _dataContextMock = new Mock<IdentityDataContext>() 
    { 
     CallBase = true 
    }; 

    // The error appears here ---------------- _ 
    dataContextMock.Setup(x => x.Searches).Returns(dbSet.Object); 
    //---------------------------------------------------------------------- 

    _dataContextMock.Setup(x => x.Set<Search>()).Returns(dbSet.Object); 

    _searchRepository = new SearchRepository(_dataContextMock.Object); 
} 

Что мне не хватает?

ответ

0

1) нет необходимости в модульном тестировании DbContext. Microsoft уже провела бы обширное тестирование.

2) если DbContext будет использоваться в качестве зависимости для другого класса то абстрагироваться от DbContext

public interface IDataContext { 
    DbSet<Search> Searches { get; set; } 
} 

public class IdentityDataContext : IdentityDbContext<ApplicationUser>, IDataContext { ... } 

public class SearchRepository { 
    public SearchRepository(IDataContext context) { ... } 
} 

Не у вас классов в зависимости от конкрементов, а на абстракциях. IdentityDataContext - это деталь реализации, о которой не могут знать зависимые классы.

Это позволит затем больше гибкости для тестирования

Mock<IDataContext> _dataContextMock; 

[TestInitialize] 
public void SetupTest() { 

    //DataInitializer.GetAllSearches() returns a List of "Search" 
    _searches = DataInitializer.GetAllSearches(); 
    var queryable = _searches.AsQueryable(); 

    var dbSet = new Mock<DbSet<Search>>(); 
    dbSet.As<IQueryable<Search>>().Setup(m => m.Provider).Returns(queryable.Provider); 
    dbSet.As<IQueryable<Search>>().Setup(m => m.Expression).Returns(queryable.Expression); 
    dbSet.As<IQueryable<Search>>().Setup(m => m.ElementType).Returns(queryable.ElementType); 
    dbSet.As<IQueryable<Search>>().Setup(m => m.GetEnumerator()).Returns(() => queryable.GetEnumerator()); 
    dbSet.Setup(d => d.Add(It.IsAny<Search>())).Callback<Search>(_searches.Add); 


    _dataContextMock = new Mock<IDataContext>(); 

    _dataContextMock.Setup(x => x.Searches).Returns(dbSet.Object); 

    _dataContextMock.Setup(x => x.Set<Search>()).Returns(dbSet.Object); 

    _searchRepository = new SearchRepository(_dataContextMock.Object); 

} 
+0

Спасибо за это. Это подход, о котором я не думал. Я прочитал эту статью [https://msdn.microsoft.com/en-us/library/dn314429 (v = vs.113) .aspx # Anchor_7) в MSDN. Мне интересно, почему этот другой подход не мог работать в моем случае? В основном, они используют Сервис, когда я реализую шаблоны репозитория и единицы дизайна работы. Но они имеют ту же цель: управлять моделями. Я ошибаюсь ? – BertrandD

Смежные вопросы