2017-09-18 18 views
1

私は個々の認証を持つASP.NET MVC Webアプリケーションを使って、ユーザーの車に関する詳細を保存しています。私はエンティティフレームワークを嘲笑してWebアプリケーションを単体テストする必要があります。したがって、ApplicationDbContextクラスのインターフェイスを実装する必要があります。IdentityDbContextを使用してEntity Frameworkをモックする方法は?

これは私のエンティティフレームワークを使用した最初の試みで、ユニットテスト時にApplicationDbContextクラスとインターフェイスがフレームワークを模擬するのに適しているかどうかをチェックしたかったのですか?

public interface IApplicationDbContext : IDisposable 
{ 
    IDbSet<ApplicationUser> Users { get; set; } 
    DbSet<CarModel> Cars { get; set; } 
    int SaveChanges(); 
    void MarkAsModified(CarModel car); 
} 

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>, IApplicationDbContext 
{ 
    public ApplicationDbContext() 
     : base("ApplicationDb", throwIfV1Schema: false) 
    { 
    } 

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

    public DbSet<CarModel> Cars { get; set; } 

    public override IDbSet<ApplicationUser> Users { get; set; } 

    public void MarkAsModified(CarModel car) 
    { 
     Entry(car).State = EntityState.Modified; 
    } 
} 

いくつかのクラスは、Visual Studiosのクイックアクションを使用して自動修正によって形成されました。 モデルにIDbSetが必要な理由は誰でも説明できますが、CarModelsにはちょうどDbSetが必要で、クラスのUsersにはオーバーライドが必要な理由は何ですか?

+1

あなたのDbContextプロパティは、あなたがそれらを嘲笑しようとするならば、おそらくpublic virtualであるべきです。 – CalC

答えて

0

ApplicationUserモデルはIDbSetが必要ですが、CarModelsはあなたがあなたのケースでは、両方のUsersRolesプロパティ

public virtual IDbSet<TUser> Users { get; set; } 
public virtual IDbSet<TRole> Roles { get; set; } 

ためIDbSet<TEntity>を使用し、デザインするだけDbSet

IdentityDbContext classを必要とする理由、誰が説明してもらえ同じパターンに従うことができます

public virtual IDbSet<CarModel> Cars { get; set; } 

して、インターフェイス、インターフェイスは、次いで、安全に単離されたユニットテストのために嘲笑することができるだけでなく

public interface IApplicationDbContext : IDisposable { 
    IDbSet<ApplicationUser> Users { get; set; } 
    IDbSet<CarModel> Cars { get; set; } 
    int SaveChanges(); 
    void MarkAsModified(CarModel car); 
} 

一致するように更新するには、インターフェースが被検者に注入された提供しました。

なぜ、ApplicationDbContextクラスのユーザーにオーバーライドが必要なのですか?

それは実際にクラスの一般的な本質として上書きする必要はありません(すなわちIdentityDbContext<ApplicationUser>)すでにプロパティが提供さApplicationUserタイプに従ってくださいになるだろう。あなたはそれをそのまま放置しておくことができます。

public class ApplicationDbContext 
    : IdentityDbContext<ApplicationUser>, IApplicationDbContext { 

    public ApplicationDbContext() 
     : base("ApplicationDb", throwIfV1Schema: false) { 
    } 

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

    public virtual IDbSet<CarModel> Cars { get; set; } 

    public void MarkAsModified(CarModel car) { 
     Entry(car).State = EntityState.Modified; 
    } 
} 
関連する問題