1

我一直在试图弄清楚如何对我的应用程序进行单元测试,但我不太明白所有东西是如何组合在一起的。

我遵循了 John Papa 的 PluralSight (SPA) 教程,并以完全相同的方式构建了我的模型、存储库和工作单元。不幸的是,他没有提供任何关于我们如何进行单元测试的示例。

我玩过 Moq 并在网上找到很少的链接来解释如何做到这一点,但不幸的是我一无所获。

一些提供上下文的代码:

public interface IRepository<T> where T : class
{
    IQueryable<T> GetAll();
    T GetById(int id);
    void Add(T entity);
    void Update(T entity);
    void Delete(T entity);
    void Delete(int id);
}

public interface IFeedbackRepository : IRepository<Feedback>
{
    IQueryable<Feedback> GetByFeedbackFor(int id);
}

public class FeedbackRepository : EFRepository<Feedback>, IFeedbackRepository
{
    public FeedbackRepository(WebAppDbContext context) : base(context) { }
    public IQueryable<Feedback> GetByFeedbackFor(int id) 
    {
        return DbSet.Where(f => f.FeedbackForId == id);
    }
}

public interface IWebAppUow
{
    void Commit();

    IFeedbackRepository Feedbacks { get; }
}

   public void TestMethod1()
    {
     Mock<IWebAppUow> mockUnitOfWork = new Mock<IWebAppUow>();

    // THEN ??
    }

编辑:我找到了这个链接(http://msdn.microsoft.com/en-us/data/dn314429.aspx),它解释了如何做到这一点,但直接在 DbSet 上工作。如果有人可以解释我们如何修改这个示例以使用 UoW 和存储库模式,那将是伟大的!

4

3 回答 3

1

所以,如果我正确理解了你的评论,你想测试你FeedbackRepository班级的方法。让我们看看如何为GetByFeedbackFor方法做到这一点。

你正在传递WebAppDbContext context你的FeedbackRepository. 这不是很好。可能您将无法测试此代码。您应该提取IWebAppDbContext接口并将其传递给FeedbackRepositoryctor。

我不知道这段代码背后是什么 return DbSet.Where(f => f.FeedbackForId == id); 所以我只能猜测这是基类的一些属性......但是如果假设你在这里使用上下文而不是DbSet属性你的测试方法将如下所示(我认为它将是在基本属性的情况下重写它并不难(或者甚至可能会按原样工作)):

public void ShouldReturnFeedbacksForCorrectId()
{
  var contextMock = new Mock<IWebAppDbContext>();

  // fill expected for example with 2 entities with FeedbackForId == 1
  IQueryable<Feedback> expected = InitWithDataSomehow();
  contextMock.Setup(i => i.Feedbacks).Returns(expected);
  var repositoryUnderTest = new FeedbackRepository(contextMock);

  IQueryable<Feedback> actualResult = repositoryUnderTest.GetByFeedbackFor(1);

  Assert.AreEqual(expected, actualResult);
}
于 2013-11-10T14:17:03.333 回答
1

如果您是单元测试新手,那么测试 EF 并不是最好的开始方式,因为它很难模拟其上下文和所有 API。我建议遵循一些更简单的示例。

对于 EF 单元测试,我建议您检查Effort 框架工作。这是它在其网站上的解释

Effort 是一个强大的工具,可以方便地为基于实体框架的应用程序创建自动化测试。它基本上是一个 ADO.NET 提供程序,它在轻量级进程内主内存数据库而不是传统的外部数据库上执行所有数据操作。它还提供了一些直观的帮助器方法,可以很容易地将此​​提供程序与现有的 ObjectContext 或 DbContext 类一起使用。对现有代码的简单添加可能足以创建可以在没有外部数据库存在的情况下运行的数据驱动测试。

于 2013-11-09T19:04:36.713 回答
1

我不会对您的存储库进行单元测试,DbContext 是一个依赖于真实数据库的具体类,据我所知,我不能用 Moq 模拟它。所以我所做的是专注于单元测试使用存储库的代码并模拟存储库。

要实际测试您的存储库,我会使用集成测试。

于 2013-11-10T14:27:27.997 回答