我是否应该使用存储库模式或模拟框架来模拟'在创建数据库表之前本地模型?

时间:2017-07-20 15:43:13

标签: asp.net-mvc unit-testing mocking

我有一个使用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类切换到真正的类很简单。

谢谢,

尼尔

0 个答案:

没有答案