2

我想使用 NUnit 测试框架对方法 ExecLogin() 进行单元测试。但是我在编写测试代码时遇到问题,因为 GenerateInput() 方法被声明为内部虚拟。因此,我无法将我认为需要的 SessionUserId 参数传递给它。请指导我如何为 ExecLogin() 编写单元测试代码。我是测试新手。

这与 ASP.NET MVC3 测试控制器操作有关。

    public class BaseController : Controller
    {
        public string SessionUserId
        {
            get { return Session["UserId"] as string; }
            set { Session["UserId"] = value; }
        }

        internal virtual SomeType GenerateInput(SomeType inputData)
        {
             var finalInput = new StringBuilder(600);

             finalInput.Append("<Root>")
             .Append("<UserId>")
             .Append(SessionUserId)
             .Append("</UserId>")
             .Append("<IPAddress>")
             .Append(this.GetClientIpAddress())
             .Append("</IPAddress>")
             .Append(inputData.InputValue)
             .Append("</Root>");

             inputData.InputValue = finalInput.ToString();
             return inputData;
        }
    }

    public class LoginController : BaseController
    {
        [HttpPost]
        public JsonResult ExecLogin(JsonRequest<LoginModel> request)
        {
            var loginObj = request.InputObject;

            var login = new StringBuilder(300);
            login.Append("<UserName>").Append(loginObj.UserName).Append("</UserName>")
                .Append("<Password>").Append(EncodingHelper.GetHashedPassword(loginObj.Password)).Append("</Password>")
                .Append("<RememberMe>").Append(loginObj.RememberMe).Append("</RememberMe>")
                ;
        var input = new SomeType { Operation = request.Operation, PageName = ActionName, InputValue = login.ToString() };

        var returnValue = SomeDelegate.Instance.ExecuteOperation(GenerateInput(input));
        return Json(new JsonResponse<string> { Status = returnValue.Status, Result = this.PopulateSession(returnValue) });
        }
    }

这是我们的模型类:

   public class LoginModel
   {
       public string UserId { get; set; }
       public string UserName { get; set; }
       public string Password { get; set; }
       public bool RememberMe { get; set; }
       public bool IsValidUser { get; set; }
   }

   public class JsonRequest<T>
   where T : class
   {
       public string Operation { get; set; }
       public T InputObject { get; set; }
   }

在学习依赖注入模式时,我开始知道使用具体类可以使代码更紧密地耦合。代码耦合得越紧密,测试就越困难。这就是为什么我无法正确测试它的原因吗?请帮忙。

4

1 回答 1

1

这实际上是一个常见模式的一部分,如何在不干扰公开可用的接口的情况下提供额外的测试挂钩点,幸运的是,内部是你的朋友。

我假设问题是您有 2 个程序集,为简单起见,我们称它们为 MyCode.dll 和 MyCode.Tests.dll。这意味着 MyCode.Tests 无法访问 MyCode 的内部方法,因为基本上它不是内部的:-)

如果您转到 MyCode 项目的 AssemblyInfo.cs 文件,则可以添加以下内容

[assembly:InternalsVisibleTo("MyCode.Tests")

这正是它所说的,它使您的内部结构在 MyCode.Tests 代码库中可见。有关详细信息,请参阅InternalsVisibleToFriend 程序集

于 2012-10-16T09:55:35.680 回答