我有一个使用Entity Framework Code First的ASP.NET MVC应用程序。
我希望能够测试我的应用程序'外观和感觉'和交互,而无需先创建数据库表。这是首选,因为如果我因某种原因对模型进行更改,我不想继续更新数据库。
这是使用存储库模式的好地方吗?
我目前的代码:
型号:
public class FATTemplateHeader
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
public int AnatomyModelId { get; set; }
public virtual AnatomyModel AnatomyModel { get; set; }
[StringLength(128)]
public string Description { get; set; }
[StringLength(16)]
public string TemplateVersion { get; set; }
public DateTime DateCreated { get; set; }
public char Status { get; set; }
public string CreatedBy { get; set; }
[ForeignKey("CreatedBy")]
public virtual AspNetUser User { get; set; }
}
接口:
public interface IFatTemplateRepository
{
#region FatTemplateHeader
IEnumerable<FATTemplateHeader> GetFatTemplateHeaders();
IEnumerable<FATTemplateHeader> GetFatTemplateHeadersByModel(int modelId);
FATTemplateHeader GetFatTemplateHeaderByName(string name);
void InsertFatTemplateHeader(FATTemplateHeader header);
void DeleteFatTemplateHeader(int headerId);
void UpdateFatTemplateHeader(FATTemplateHeader header);
#endregion
void Save();
}
将使用数据库的真实类:
public class FatTemplateRepository : IFatTemplateRepository, IDisposable
{
private Db _dbContext;
public FatTemplateRepository(Db context)
{
_dbContext = context;
}
#region FAT Template Header
public IEnumerable<FATTemplateHeader> GetFatTemplateHeaders()
{
return _dbContext.FATTemplateHeaders.ToList();
}
public IEnumerable<FATTemplateHeader> GetFatTemplateHeadersByModel(int modelId)
{
return _dbContext.FATTemplateHeaders.Where(x => x.AnatomyModelId == modelId).ToList();
}
public FATTemplateHeader GetFatTemplateHeaderByName(string name)
{
return _dbContext.FATTemplateHeaders.Find(name);
}
public void InsertFatTemplateHeader(FATTemplateHeader header)
{
_dbContext.FATTemplateHeaders.Add(header);
}
public void DeleteFatTemplateHeader(int headerId)
{
FATTemplateHeader header = _dbContext.FATTemplateHeaders.Find(headerId);
_dbContext.FATTemplateHeaders.Remove(header);
}
public void UpdateFatTemplateHeader(FATTemplateHeader header)
{
_dbContext.Entry(header).State = EntityState.Modified;
}
#endregion
public void Save()
{
_dbContext.SaveChanges();
}
// IDispose
private bool disposed = false;
protected virtual void Dispose(bool disposing)
{
if (!this.disposed)
{
if (disposing)
{
_dbContext.Dispose();
}
}
this.disposed = true;
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
}
使用Lists作为集合的模拟类:
public class MockFatTemplateRepository: IFatTemplateRepository
{
#region FAT Template Header
private static IList<FATTemplateHeader> mockFatTemplateHeaders;
public MockFatTemplateRepository()
{
if (!mockFatTemplateHeaders.Any())
{
// Seed with data
IList<FATTemplateHeader> mockFatTemplateHeaders = new List<FATTemplateHeader>
{
new FATTemplateHeader
{
Id = 1,
AnatomyModelId = 1,
Description = "TEST 1",
TemplateVersion = "1.0",
DateCreated = DateTime.Now,
Status = 'A',
CreatedBy = "user1"
},
new FATTemplateHeader
{
Id = 2,
AnatomyModelId = 1,
Description = "TEST 2",
TemplateVersion = "1.1",
DateCreated = DateTime.Now,
Status = 'A',
CreatedBy = "user1"
}
};
}
}
public IEnumerable<FATTemplateHeader> GetFatTemplateHeaders()
{
return mockFatTemplateHeaders;
}
public IEnumerable<FATTemplateHeader> GetFatTemplateHeadersByModel(int modelId)
{
return mockFatTemplateHeaders.Where(x => x.AnatomyModelId == modelId).ToList();
}
public FATTemplateHeader GetFatTemplateHeaderByName(string name)
{
return mockFatTemplateHeaders.Where(x => x.Description == name).FirstOrDefault();
}
public void InsertFatTemplateHeader(FATTemplateHeader header)
{
mockFatTemplateHeaders.Add(header);
}
public void DeleteFatTemplateHeader(int headerId)
{
FATTemplateHeader deleteHeader = mockFatTemplateHeaders.Where(x => x.Id == headerId).FirstOrDefault();
if (deleteHeader != null)
mockFatTemplateHeaders.Remove(deleteHeader);
}
public void UpdateFatTemplateHeader(FATTemplateHeader header)
{
FATTemplateHeader updateHeader = mockFatTemplateHeaders.Where(x => x.Id == header.Id).FirstOrDefault();
if (updateHeader != null)
{
updateHeader = header;
}
}
#endregion
public void Save()
{
}
}
此外,我已经阅读了一些关于使用模拟框架(如Moq)的内容,但它似乎主要用于单元测试。
关于我是否应该使用上面的代码中的接口,或者这是否是模拟框架的工作,我完全感到困惑。
最后我对如何将我的模型注入我的控制器感到困惑,这样当我对我的模型感到满意并且我确实创建了我的数据库表时,从Mock类切换到真正的类很简单。
谢谢,
尼尔