2016-11-15 2 views
3

で無効な設定を持っている私はユニットテストIdentityDbContextからMOQ:プロパティが正しく仮想として設定したが、まだ非仮想メンバ

を継承DbContextしたいのですが、私はとNotSupportedExceptionエラーメッセージを取得しています非常に一般的なメッセージ:

System.NotSupportedException:私はすでに再いくつかの手がかりを見つけるために、非仮想(オーバーライド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(); 
    } 
} 

は私の検索 POCOです:最後にここ

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; }   
} 

は私のセットアップは方法です:

[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を単体テストする必要はありません。マイクロソフトは既にそれについて広範なテストを行っていただろう。

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

感謝をテストするためのより多くの柔軟性を可能にします。それは私が考えなかったアプローチです。 MSDNでこの[記事](https://msdn.microsoft.com/en-us/library/dn314429(v=113).aspx#Anchor_7)を読んでいます。私はなぜこの他のアプローチが私の場合にはうまくいかないのだろうと思っていますか? 基本的に、私はリポジトリと作業単位の設計パターンを実装している間にサービスを使用します。しかし、それらはモデルの管理という同じ目的を持っています。私が間違っている ? – BertrandD

関連する問題