我正在尝试编写一个示例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:未将对象引用设置为对象的实例。
你能帮我吗?答案 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;