【问题标题】:Need help calling a Repository from a Controller in Unit Testing需要帮助在单元测试中从控制器调用存储库
【发布时间】:2020-01-07 06:41:06
【问题描述】:

我需要为我们的项目设置单元测试。在我们的控制器中,我们使用一个包含所有存储库的工作单元,并在我们的IHttpActionResult 中调用存储库来获取数据。

到目前为止,我已经设置了接口模拟,这在控制器中调用了正确的IHttpActionResult,但没有返回数据。

[TestMethod]
public void TestMethod1()
{
    var unitOfWork = new Mock<IUnitOfWork>();
    var repo = new Mock<IAuditReleaseRepository>();
    unitOfWork.Setup(e => e.AuditReleaseRepository).Returns(repo.Object);
    var auditReleaseController = new AuditReleaseController(unitOfWork.Object);
    var result = auditReleaseController.Get() as ViewResult;
    var model = result.ViewData.Model as IQueryable<AuditReleas>;
    Assert.AreEqual(12, model.Count());
}
public class AuditReleaseController : BaseController
{
    private IAuditReleaseRepository _auditReleaseRepository;
    private IUnitOfWork _unitOfWork;
    public AuditReleaseController(IUnitOfWork unitOfWork)
    {
        this._unitOfWork = unitOfWork;
        this._auditReleaseRepository = unitOfWork.AuditReleaseRepository;
    }

    [HttpGet, Route("audit-releases")]
    public IHttpActionResult Get()
    {
        var query = this._auditReleaseRepository.GetAll();
        return Ok(query);
    }
}
public class AuditReleaseRepository : RepositoryBase<AuditReleas>, IAuditReleaseRepository
{
    private readonly RetailAssignmentEntities _entities;

    public AuditReleaseRepository(RetailAssignmentEntities entities) : base(entities)
    {
        this._entities = entities;
    }

    IEnumerable<AuditReleaseDto> IDtoRepository<AuditReleaseDto>.GetAll()
    {
        return base.GetAll().Where(x=>x.IsReleaseEnabled).Select(AuditReleaseMapping.All).OrderByDescending(x => x.Id);
    }
}

这是在 GetAll 方法中获取数据的映射:

public class AuditReleaseMapping
    {
        public static Expression<Func<AuditReleas, AuditReleaseDto>> All = (auditRelease) => new AuditReleaseDto()
        {
           EndDate = auditRelease.AuditReleaseEndDate,
           Id = auditRelease.AuditReleaseId,
           Name = auditRelease.AuditReleaseName,
           StartDate = auditRelease.AuditReleaseStartDate,
           AuditPeriodId = auditRelease.AuditPeriod.AuditPeriodId,
           AuditYearId = auditRelease.AuditPeriod.AuditYear.AuditYearId,
           AuditEndDate = auditRelease.AuditPeriod.AuditEndDate,
           AuditStartDate = auditRelease.AuditPeriod.AuditStartDate
        };
    }

理想的做法是调用控制器,它会调用存储库,然后调用映射,但到目前为止它甚至没有调用存储库来获取数据。我需要帮助来设置该功能。

【问题讨论】:

  • 你还没有模拟 IAuditReleaseRepository GetAll 方法
  • @andyb952 您想在答案中详细说明吗?
  • 您在哪里设置您希望控制器在单元测试中返回的数据?如前所述,您应该设置 GetAll() 以实际返回一些数据。
  • GetAll() 太可怕了——这段代码会在尝试过滤之前将所有个数据库记录加载到内存中吗?
  • @andyb952 我需要为我的数据返回映射实体。您是否有任何煽动如何模拟 GetAll 方法以允许这种情况发生?

标签: c# asp.net-mvc unit-testing moq


【解决方案1】:

您似乎需要为您的 Mock repo.GetAll() 设置行为。您需要创建一个 AuditReleaseDto 列表,以便您的 Mocked repo 返回。称之为TestAuditReleaseDtos。您可以在 TestMethod 的开头或在 TestClass 初始化中创建此 TestData。然后在创建 Mock 后立即在一行中使用它:


    var repo = new Mock<IAuditReleaseRepository>();
    repo.Setup(r => r.GetAll()).Returns(TestAuditReleaseDtos);
    unitOfWork.Setup(e => e.AuditReleaseRepository).Returns(repo.Object);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-05
    • 2011-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-28
    • 1970-01-01
    相关资源
    最近更新 更多