用于测试缓存数据的Nunit脚本

时间:2011-07-11 11:43:04

标签: c# testing caching 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:未将对象引用设置为对象的实例。

你能帮我吗?

2 个答案:

答案 0 :(得分:1)

NUnit不在Web上下文上运行,因此HttpContext.Current为空。如果要测试它,您需要手动创建我们的上下文。

您可以为httpcontext创建一个模拟类。请Google mock httpcontext,您会找到一些可能对您有用的链接。

答案 1 :(得分:1)

在测试绑定到HttpContext的代码时,您必须依赖抽象并使用伪/存根的http上下文。有关该主题的更多信息,请参阅this question

不幸的是,缓存对象(和Cache类)不容易伪造,因为它是一个密封的类。要做的就是创建一个包装类,其中包含Cache对象周围的相应接口以及测试中的假/存根/模拟。

您可以在Web应用程序外部访问Cache类,但在这种情况下,您可能不希望这样做。可以通过引用System.Web程序集并使用HttpRuntime类来访问缓存。

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