0

在我的申請,我有這樣的代碼:保存對象之前,添加一個角色。這個邏輯在哪裏?

public class Couple 
{ 
    public List<Role> Roles { get; set; }; 
    public Couple() 
    { 
     //How can I add the role in the constructor? 
     //Is it correct to refer to the repository? 
     //If so, this will impact on my EF Code First 
    } 
} 

public class Role 
{ 
    public string Name { get; set; }; 
} 

public class DataContext : DbContext 
{ 
    DbSet<Couple> Couples { get; set; } 
    DbSet<Role> Roles { get; set; } 
} 

public interface IRepository 
{ 
    void AddCouple(Couple couple); 
} 

public class Repository : IRepository 
{ 
    DataContext db = new DataContext(); 

    public void AddCouple(Couple couple) 
    { 
     var role = (from r in db.Roles 
         where r.Name == "Couple" 
         select r).SingleOrDefault(); 

    couple.Roles.Add(role); //This is a correct place? 
     db.Couples.Add(entity); 

     db.SaveChanges(); 
    } 
} 

我也有假的存儲庫中的測試項目:

public class FakeRepository : IRepository 
{ 
    List<Couple> Couples = new List<Couple>(); 
    ListRole> Roles = new List<Role>(); 

    public void AddCouple(Couple couple) 
    { 
     var role = (from r in Roles 
         where r.Name == "Couple" 
         select r).SingleOrDefault(); 

     couple.Roles.Add(role); 
     Couples.Add(entity); 
    } 
} 

RepositoryAddCouple方法,我想補充的作用。但我認爲這是不正確的地方。

我的問題是在哪裏放置邏輯,看在role庫和填充couple的角色列表。

並且能夠繼續構建測試。

回答

0

在你的倉庫下面這行是有問題的:

DataContext db = new DataContext(); 

它會阻止你單位在隔離測試這個類作爲您強烈它依賴於一些特定的數據訪問類。

您可以定義一個抽象:

public interface IMyDataContext 
{ 
    DbSet<Couple> Couples { get; set; } 
    DbSet<Role> Roles { get; set; } 
    int SaveChanges(); 
} 

然後提供一些實現:

public class DataContext : DbContext, IMyDataContext 
{ 
    public DbSet<Couple> Couples { get; set; } 
    public DbSet<Role> Roles { get; set; } 
} 

現在你的資料庫應該只與抽象的工作:

public class Repository : IRepository 
{ 
    private readonly IMyDataContext _db; 
    public Repository(IMyDataContext db) 
    { 
     _db = db; 
    } 

    public void AddCouple(Couple couple) 
    { 
     var role = (from r in _db.Roles 
        where r.Name == "Couple" 
        select r).SingleOrDefault(); 

     couple.Roles.Add(role); 
     _db.Couples.Add(entity); 
     _db.SaveChanges(); 
    } 
} 

現在在你單位測試你可以使用模擬框架將假上下文提供給存儲庫並能夠單獨進行測試。

+0

好了,但即使是這樣,現在我的'我DbContext'將不得不重複的邏輯: 'VAR角色=(在_db.Roles從r 其中r.Name == 「情侶」 選擇R).SingleOrDefault (); couple.Roles.Add(role);' 我需要在保存之前爲'couple'添加一個'role',但不需要複製代碼。我不知道在哪裏。 – ridermansb

+0

@Riderman de Sousa Barbosa,我不明白你在說什麼重複。我以爲你在問如何單獨測試你的倉庫。 –

+0

爲了測試AddCouple方法,我需要集中邏輯來添加一個Role。否則,測試存儲庫是沒有意義的,因爲存儲庫將表現爲僞造的存儲庫並且生產將具有另一個存儲庫。 **請參閱以下代碼:** 'var role =(from r in _db.Roles where r.Name ==「Couple」 select r)。 SingleOrDefault(); couple.Roles.Add(role);' – ridermansb

相關問題