【问题标题】:why unit test mocks always null with controller为什么单元测试用控制器模拟总是为空
【发布时间】:2016-01-28 08:04:41
【问题描述】:

想单元测试使用 mocks 我的数据实际上存储在内存中,为什么总是从控制器响应结果中获取 null

这是我的控制器

private readonly IUnitOfWorkAsync _unitOfWorkAsync;
        private readonly IVersionService _versionService;
        public VersionController(IUnitOfWorkAsync unitOfWorkAsync, IVersionService versionService)
        {
            this._unitOfWorkAsync = unitOfWorkAsync;
            this._versionService = versionService;
        }


        public ActionResult Index()
        {
            var versions =  _versionService.Queryable();
            return View(versions);
        }

这是我的单元测试代码:

private Mock<IVersionService> _versionServiceMock;
        private Mock<IUnitOfWorkAsync> _unitOfWorkAsync;

        VersionController objController;
        List<Model.Models.Version> listVersion;

        [TestInitialize]
        public void Initialize()
        {

            _versionServiceMock = new Mock<IVersionService>();
            _unitOfWorkAsync = new Mock<IUnitOfWorkAsync>();
            objController = new VersionController(_unitOfWorkAsync.Object, _versionServiceMock.Object);

            listVersion = new List<Model.Models.Version>() {
             new Model.Models.Version() { AppName="App 1",ObjectState=ObjectState.Added,AuditField=new AuditFields()},
             new Model.Models.Version() { AppName="App 2",AppVersion="1.0",ObjectState=ObjectState.Added,AuditField=new AuditFields()},
             new Model.Models.Version() { AppName="App 3",ObjectState=ObjectState.Added,AuditField=new AuditFields()}
            };
        }

        [TestMethod]
        public void Version_Get_All()
        {
            //Arrange
            _versionServiceMock.Setup(x => x.Query().Select()).Returns(listVersion);

            //Act
            var result = (( objController.Index() as ViewResult).Model) as List<Model.Models.Version>;


        }

为什么结果总是为空,如何检查为什么会出现空。

注意:我在项目控制器中使用this 模式。

【问题讨论】:

  • 很可能您设置了一种方法,但控制器调用了另一种方法...minimal reproducible example 可以帮助验证这一点,但可能会太长 - 请考虑自己调试您的代码。
  • @Alexei Levenkov 感谢您的回复,调试后我确认 100% 控制器调用方法没有错。请告诉我一些指南如何找到实际发生的事情。正如我所说我使用了 URF 框架,他们用过hibernate,是不是问题的根源。谢谢
  • shamim,请注意您已接受展示我评论的帖子 - 您设置了 Query,但控制器调用了 Queryable。请确保该答案确实回答了您的问题(而不仅仅是感谢您在答案的 cmets 中进行讨论)。

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


【解决方案1】:

Moq 在模拟时创建它自己的接口实现。默认情况下,模拟接口上的所有方法都将返回 null。

尝试模拟 _versionService.Queryable()。像这样:

[TestMethod]
public void Version_Get_All()
{
     //Arrange
    _versionServiceMock.Setup(x => x.Queryable()).Returns(listVersion);

     //Act
    var result = (( objController.Index() as ViewResult).Model) as List<Model.Models.Version>;


}

【讨论】:

  • 根据 listVersion 是列表,所以我需要用 listVersion.AsQueryable() 替换它,我仍然得到 result=null
  • 在控制器中尝试return View(versions.ToList());
  • @Kovalenko Ivan,感谢您的回复,它现在正在工作,请告诉我为什么我需要添加到我的控制器中的列表。
  • @shamim 因为您在测试中将模型转换为List&lt;Model.Models.Version&gt;,但您的方法x.Queryable() 返回IQueryable&lt;Model.Models.Version&gt;
  • 我在我的另一种方法异步类型上尝试了你的方法,它不起作用,假设我的控制器事件看起来像:public async Task Index() { var versions = await _versionService.GetsAsync() ;返回视图(版本。ToList()); }
猜你喜欢
  • 1970-01-01
  • 2020-11-02
  • 1970-01-01
  • 2012-02-27
  • 1970-01-01
  • 1970-01-01
  • 2015-03-15
  • 2014-07-30
  • 2012-08-01
相关资源
最近更新 更多