簡體   English   中英

值不能為空。 參數名稱:測試模擬時的來源

[英]Value cannot be null. Parameter name: source at when test mock

嗨,我在MVC核心2.1中使用帶有模擬功能的NUnit測試。當測試構建我的測試在調試測試中失敗時,出現以下錯誤。

值不能為空。 參數名稱:System.Linq.Enumerable.ToList [TSource]處的源(IEnumerable`1源)

此類測試單元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>();
            }
        }

似乎您忘記了正確設置Mock對象,因此_iUnitOfEntity.ExecSpWithParam<Sp_lod_Group_Result>(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返回null。 這是ArgumentNullException的原因。

我不知道您使用哪個模擬框架

_iUnitOfEntity = new Mock<IUnitOfEntity>();

您需要定義ExecSpWithParam<Sp_lod_Group_Result>(query, ref outputParam, inputParam)應返回的內容。

希望能有所幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM