【问题标题】:Value cannot be null. Parameter name: source at when test mock值不能为空。参数名称:测试模拟时的来源
【发布时间】:2018-07-25 12:05:16
【问题描述】:

您好,我在 MVC 核心 2.1 中使用带有模拟的测试 NUnit。当测试构建时我的测试失败 调试测试时出现以下错误。

值不能为空。参数名称:source at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)

这个类测试单元mvc core 2.1

 public class Role_Test
        {
            #region Fields   
            private static IRoleService _IRoleService;
            #endregion

            private static Mock<IUnitOfEntity> _iUnitOfEntity;
            private static Mock<IMapper> _mapper;
            private static Mock<ISecurityAuthorizService>  _ISecurityAuthorizService;

            [ClassInitialize]
            public static void ClassInit(TestContext context)
            {
                _iUnitOfEntity = new Mock<IUnitOfEntity>();
                _mapper = new Mock<IMapper>();
                _ISecurityAuthorizService = new Mock<ISecurityAuthorizService>();
                _IRoleService = new RoleService(_iUnitOfEntity.Object,         _mapper.Object, _ISecurityAuthorizService.Object);
            }         
            [TestMethod]
            public void TestMethod()
            {
               var serviceMock = new Mock<IRoleService>();
               //serviceMock.Setup(x => x.LoadRole(0,0));
                var result = _IRoleService.LoadRole(0,0);

                Assert.AreEqual(0, result.Count);
            }
        }
    }



 private readonly IUnitOfEntity _iUnitOfEntity;
        private readonly IMapper _mapper;
        private readonly ISecurityAuthorizService  _ISecurityAuthorizService;
        public RoleService(IUnitOfEntity unitOfEntity, IMapper mapper,  ISecurityAuthorizService ISecurityAuthorizService)
        {
            _iUnitOfEntity = unitOfEntity;
            _mapper = mapper;
            _ISecurityAuthorizService = ISecurityAuthorizService;
        }

       public List<RoleTreeViewModel> LoadRole(long AccessorId  ,decimal AccessorDetailId)
        {
            try
            {
                Dictionary<string, object> outputParam = new Dictionary<string, object>();
                List<SqlParameter> inputParam = new List<SqlParameter>();
                string query = "Sp_Lod_RoleTree_94200";
                inputParam.Add(new SqlParameter("@AccessorId", 2237));
                inputParam.Add(new SqlParameter() { ParameterName = "@AccessorDetailId", SqlValue = 0.0, DbType = DbType.Decimal });
                inputParam.Add(new SqlParameter("@AccessorTypeId", 6));
                //(int)EnumManager.EnumObjectType.Role
                outputParam.Add("@Error", "");
                List<Sp_lod_Group_Result> sp_result = _iUnitOfEntity.ExecSpWithParam<Sp_lod_Group_Result>(query, ref outputParam, inputParam).ToList();
                return _mapper.Map<List<Sp_lod_Group_Result>, List<RoleTreeViewModel>>(sp_result);
            }
            catch (Exception e)
            {
                return new List<RoleTreeViewModel>();
            }
        }

【问题讨论】:

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


    【解决方案1】:

    您似乎忘记正确设置您的 Mock 对象,因此 _iUnitOfEntity.ExecSpWithParam&lt;Sp_lod_Group_Result&gt;(query, ref outputParam, inputParam) 返回 null。

    ToList 是一个扩展方法,所以

    _iUnitOfEntity.ExecSpWithParam<Sp_lod_Group_Result>(query, ref outputParam, inputParam).ToList()
    

    一样
    Enumerable.ToList(
        _iUnitOfEntity.ExecSpWithParam<Sp_lod_Group_Result>(query, ref outputParam, inputParam)
    )
    

    _iUnitOfEntity.ExecSpWithParam 返回空值。 这就是 ArgumentNullException 的原因。

    我不知道你用的是哪个 Mocking Framework,但我猜是之后

    _iUnitOfEntity = new Mock<IUnitOfEntity>();
    

    你需要定义ExecSpWithParam&lt;Sp_lod_Group_Result&gt;(query, ref outputParam, inputParam)应该返回什么。

    希望对您有所帮助。

    【讨论】:

    • 感谢使用时看到此错误“Mock”不包含“ExecSpWithParam”的定义,并且没有扩展方法“ExecSpWithParam”接受“Mock”类型的第一个参数找到(您是否缺少 using 指令或程序集引用?)
    猜你喜欢
    • 2013-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-06
    • 2019-06-12
    • 2020-08-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多