在我的应用程序中,我有这段代码:
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);
}
}
在Repository
方法的AddCouple
类中,我添加了该角色。但我认为这不是正确的地方。
我的问题是放置逻辑的位置,查看role
存储库并填充couple
的角色列表。
能够继续建立测试。
答案 0 :(得分: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();
}
}
现在,在您的单元测试中,您可以使用模拟框架将虚假上下文提供给存储库,并能够单独测试它。