2011-07-11 8 views
0

は、私はサンプルNUnitのテストスクリプトは、キャッシュNUnitのスクリプト

の値をチェックするために書き込みをしようとしている私は

[TestFixture] 

class Authorization 
{ 
    class AutherizationEntity 
    { 
     public int UserID { get; set; }   
     public int OperationCode { get; set; } 
     public bool permission { get; set; } 
    } 


    [SetUp] 
    public void Initialize() 
    { 

      //if (HttpContext.Current.Cache["UserRights"] == null) 
      //{ 
       List<AutherizationEntity> AuthorisationObject = new List<AutherizationEntity>(); 

       for (int i = 0; i < 5; i++) 
       { 
        AutherizationEntity AEntity = new AutherizationEntity(); 
        AEntity.OperationCode = 10; 
        AEntity.permission = true; 
        AEntity.UserID = i; 
        AuthorisationObject.Add(AEntity); 
       } 
       HttpContext.Current.Cache.Insert("UserRights", AuthorisationObject); //Here i am getting the exception in NUnit 
      //} 

    } 

    [TestCase] 
    public void AuthorizeUser() 
    {   
     int UserId = 1; 
     int OperationCode = 10;   
     Boolean HaveRight = false; 

     List<AutherizationEntity> AuthEntity = new List<AutherizationEntity>(); 
     AuthEntity = (List<AutherizationEntity>)HttpContext.Current.Cache.Get("UserRights"); 

     foreach (AutherizationEntity Auth in AuthEntity) 
     { 
      if ((Auth.UserID == UserId) && (Auth.OperationCode==OperationCode)) 
      { 
       HaveRight = Auth.permission; 
      } 
     } 

     Assert.AreEqual(HaveRight, true); 
    }  

} 

のようなコードを書いたしかし、私はしてスクリプトを実行しようとしていたときにNUnit例外が発生しました

Authorization.AuthorizeUser(): SetUp:System.NullReferenceException:オブジェクト参照がオブジェクトのインスタンスに設定されていません。

お願いします。

答えて

1

NUnitはWebコンテキストで実行されないため、HttpContext.Currentはnullです。テストする場合は、手動でコンテキストを作成する必要があります。

httpcontextのモッククラスを作成できます。 Google mock httpcontextを入力してください。便利なリンクがいくつか見つかります。

+0

返事をありがとう、あなたは私にもう少し説明や役立つリンク – san

+0

@sanを与えることができれば...それは役に立つかもしれません:私は、表示する特定のサンプルを持っていません。私は私のポストにあなたを助けるかもしれないGoogle検索を提案した。 –

+0

ありがとうクラウディオRedi ... – san

1

HttpContextにバインドされたコードをテストするときは、抽象化に頼らざるを得ず、偽の/スタブされたhttpコンテキストを使用する必要があります。このトピックの詳細については、this questionを参照してください。

残念ながら、キャッシュオブジェクト(およびCacheクラス)は、密封されたクラスであるため、簡単に偽造することはできません。方法は、Cacheオブジェクトの周りに対応するインタフェースを持つラッパークラスを作成し、テストでそれを擬似/スタブ/モックすることです。

Webアプリケーションの外部でCacheクラスにアクセスできますが、この場合はそうしたくないかもしれません。キャッシュにアクセスするには、System.Webアセンブリを参照し、HttpRuntimeクラスを使用します。

using System.Web; 
using System.Web.Caching; 
… 
Cache cache = HttpRuntime.Cache; 
+0

ありがとう...それは動作します – san