2

NUnitテストフレームワークを使用してメソッドExecLogin()をユニットテストしたいと思います。しかし、GenerateInput()メソッドが内部仮想として宣言されているため、テスト用のコードを記述しているときに問題が発生します。そのため、必要と思われるSessionUserIdパラメーターを渡すことができません。ExecLogin()の単体テストコードの書き方を教えてください。私はテストに不慣れです。

これは、ASP.NETMVC3テストコントローラーのアクションに関連しています。

    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 コード ベース内で見えるようになります。詳細については、InternalsVisibleToおよびFriend アセンブリを参照してください。

于 2012-10-16T09:55:35.680 に答える