模拟存储过程的输出参数

时间:2015-04-27 15:22:47

标签: c# .net unit-testing mocking moq

我有以下方法

public bool IsUserAllowedToDoThings(string userName, string thingToDo)
    {
        var outputParameter = new ObjectParameter("IsAllowed", typeof(bool?));
        _context.SP_IsUserAllowedToDoThings(userName, thingToDo, outputParameter);
        return (bool)outputParameter.Value;
    }

该方法只使用EF调用SP并返回SP的输出结果。但我在模拟SP的单元测试输出方面遇到了问题。 附:我正在使用MOQ框架进行模拟。

2 个答案:

答案 0 :(得分:3)

在第三次阅读MOQ手册后,我终于找到了这样做的方法。这简直太简单了:

 mockObjectContext.Setup(m => m.SP_IsUserAllowedToDoThings(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<ObjectParameter>())).Callback<string, string, ObjectParameter>((a, b, c) =>
        {
            c.Value = true;
        });

答案 1 :(得分:0)

即使我有类似的方法:

public IEnumerable<string> PrintMasterBagAssignmentManifest(int companyId, int bagNo)
    {
        var errors = new List<string>();
        try
        {
            if (companyId > 0 && bagNo > 0)
            {
                var companyNumber = companyId.ToString("D2");
                var bagNumber = bagNo.ToString("D8");

                DataParameter compParameter = new DataParameter("COMP", companyNumber);
                DataParameter bagParameter = new DataParameter("BAG", bagNumber);
                DataParameter userParameter = new DataParameter("USER", UserName);
                DataParameter statusOutputParameter = new DataParameter("STATUS", "");
                statusOutputParameter.Direction = System.Data.ParameterDirection.Output;
                DataParameter[] param = new DataParameter[] {
                    compParameter,
                    bagParameter,
                    userParameter,
                    statusOutputParameter
                };

                MerretDataContext.ExecuteStoredProcedure("MBMANF", param);

                if (statusOutputParameter.Value.ToString() == "E" && string.IsNullOrEmpty(statusOutputParameter.Value.ToString()))
                {
                    errors.Add(string.Format(Resources.Resources.MASTERBAG_PRINTMANIFEST_ERROR, bagNo));
                }
            }
            else
            {
                errors.Add(Resources.Resources.MASTERBAG_INVALID);
            }
        }
        catch (Exception ex)
        {
            errors.Add(ex.Message);
        }
        return errors;
    }

此方法使用LinqToDB调用存储过程,并且我传递了一个参数数组,该数组由3个输入参数和一个输出参数组成。我在为此编写单元测试时遇到问题。我正在使用MOQ框架。