热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

如何在C#单元测试中将测试Cookie添加到请求中

如何添加测试Cookie以请求,以便可以从单元测试中测试代码.考虑这样的代码:publicActionResultDashboard(){if(Request.Cookies[u

如何添加测试COOKIE以请求,以便可以从单元测试中测试代码.考虑这样的代码:

public ActionResult Dashboard()
{
if (Request.COOKIEs["userCOOKIE"] == null)
{
return RedirectToAction("Index");
}
return View();
}

我模拟了所有内容,但是我不知道如何向COOKIE添加内容,因此这一行Request.COOKIEs [“ userCOOKIE”]不会返回null.现在它为null并返回此错误:


{“Object reference not set to an instance of an object.”}


这是我的单元测试方法之一:

[TestMethod]
[TestCategory("Unit")]
public void Login_ShouldValidateUserAndLoginSuccessfully()
{
using (var kernel = new NSubstituteMockingKernel())
{
// Setup the dependency incjection
kernel.Load(new EntityFrameworkTestingNSubstituteModule());
// Create test request data
var request = new LogInRequest { UserName = "test", Password = "test" };
var fakeRespOnseHandler= new FakeResponseHandler();
fakeResponseHandler.AddFakeResponse(new Uri("http://localhost/test"), new HttpResponseMessage(HttpStatusCode.OK));
ConfigurationManager.AppSettings["SearchApiBaseUrl"] = "http://test/internal";
var server = new HttpServer(new HttpConfiguration(), fakeResponseHandler);
var httpClient = new HttpClient(server);
var fakeCOOKIEManager = new FakeCOOKIEManager();
var authenticatiOnService= Substitute.For();
var newUser = Fake.GetNewUser(1);
var newUserClaim = Fake.GetNewUserClaim(1, newUser.Id, "http://test/identity/claims/loans");
authenticationService.GetUserByEmailPasswordAsync(request.UserName, request.Password).Returns(newUser);
authenticationService.GetUserClaimByEmailAndPasswordAsync(request.UserName, request.Password).Returns(newUserClaim);
var cOntroller= new HomeController(httpClient, fakeCOOKIEManager, null, authenticationService);
Fake.SetFakeAuthenticatedControllerContext(controller);
controller.HttpContext.Session["ReturnUrl"] = "/search";
var result = controller.Login(request);
Assert.IsNotNull(result);
}
}

这是Fake for Httpcontext中的一个类:

public static HttpContextBase InitialiseFakeHttpContext(string url = "")
{
var HttpCOntextSub= Substitute.For();
var RequestSub = Substitute.For();
var RespOnseSub= Substitute.For();
var serverUtilitySub = Substitute.For();
var itemsSub = Substitute.For();
HttpContextSub.Request.Returns(RequestSub);
HttpContextSub.Response.Returns(ResponseSub);
HttpContextSub.Server.Returns(serverUtilitySub);
var COOKIE = Substitute.For();
HttpContextSub.Response.Returns(COOKIE);
return HttpContextSub;
}

解决方法:

这是一个示例单元测试,其中在请求上设置了COOKIE.

使用NSubstitute框架模拟http上下文,然后设置请求COOKIE属性.将模拟的http上下文应用于控制器上下文以模拟请求.

[TestClass]
public class MyControllerTests {
[TestMethod]
public void Request_COOKIEs_Should_Not_Be_Null() {
//Arrange
var COOKIEs = new HttpCOOKIECollection();
COOKIEs.Add(new HttpCOOKIE("userCOOKIE"));
var mockHttpCOntext= Substitute.For();
mockHttpContext.Request.COOKIEs.Returns(COOKIEs);
var sut = new MyController();
sut.COntrollerContext= new ControllerContext {
COntroller= sut,
HttpCOntext= mockHttpContext
};
//Act
var result = sut.Dashboard() as ViewResult;
//Assert
Assert.IsNotNull(result);
}
public class MyController : Controller {
public ActionResult Dashboard() {
if (Request.COOKIEs["userCOOKIE"] == null) {
return RedirectToAction("Index");
}
return View();
}
}
}

更新:

这是使用手动创建的模拟HttpContext进行的测试的更新版本.

[TestClass]
public class MyControllerTests {
[TestMethod]
public void Request_COOKIEs_Should_Not_Be_Null() {
//Arrange
var COOKIEs = new HttpCOOKIECollection();
COOKIEs.Add(new HttpCOOKIE("userCOOKIE"));
var mockHttpCOntext= new MockHttpContext(COOKIEs);
var sut = new MyController();
sut.COntrollerContext= new ControllerContext {
COntroller= sut,
HttpCOntext= mockHttpContext
};
//Act
var result = sut.Dashboard() as ViewResult;
//Assert
Assert.IsNotNull(result);
}
public class MyController : Controller {
public ActionResult Dashboard() {
if (Request.COOKIEs["userCOOKIE"] == null) {
return RedirectToAction("Index");
}
return View();
}
}
private class MockHttpContext : HttpContextBase {
private readonly MockRequest request;
public MockHttpContext(HttpCOOKIECollection COOKIEs) {
this.request = new MockRequest(COOKIEs);
}
public override HttpRequestBase Request {
get {
return request;
}
}
public class MockRequest : HttpRequestBase {
private readonly HttpCOOKIECollection COOKIEs;
public MockRequest(HttpCOOKIECollection COOKIEs) {
this.COOKIEs = COOKIEs;
}
public override HttpCOOKIECollection COOKIEs {
get {
return COOKIEs;
}
}
}
}
}


推荐阅读
  • 在C#开发中,实现UserControls之间高效传递CheckBox值是一个常见的需求。本文详细介绍了如何通过事件和委托机制,将UserControl3中的CheckBox值传递到UserControl1中,确保数据传递的准确性和实时性。此外,还提供了代码示例和最佳实践,帮助开发者更好地理解和应用这一技术。 ... [详细]
  • 通过优化动态网络Cookies的全网互通机制,实现了用户在任意子站点的登录和注销操作均能同步至整个网络。具体实现涉及对三个关键文件的修改:首先,在`incDv_ClsMain.asp`中定位并调整`Response.Cookies`的相关设置;其次,更新`global.asa`以确保会话状态的一致性;最后,修改`login.asp`以支持跨域认证。这一改进不仅提升了用户体验,还增强了系统的安全性和可靠性。 ... [详细]
  • 在尝试对 QQmlPropertyMap 类进行测试驱动开发时,发现其派生类中无法正常调用槽函数或 Q_INVOKABLE 方法。这可能是由于 QQmlPropertyMap 的内部实现机制导致的,需要进一步研究以找到解决方案。 ... [详细]
  • 使用 ListView 浏览安卓系统中的回收站文件 ... [详细]
  • C++ 异步编程中获取线程执行结果的方法与技巧及其在前端开发中的应用探讨
    本文探讨了C++异步编程中获取线程执行结果的方法与技巧,并深入分析了这些技术在前端开发中的应用。通过对比不同的异步编程模型,本文详细介绍了如何高效地处理多线程任务,确保程序的稳定性和性能。同时,文章还结合实际案例,展示了这些方法在前端异步编程中的具体实现和优化策略。 ... [详细]
  • 在处理 XML 数据时,如果需要解析 `` 标签的内容,可以采用 Pull 解析方法。Pull 解析是一种高效的 XML 解析方式,适用于流式数据处理。具体实现中,可以通过 Java 的 `XmlPullParser` 或其他类似的库来逐步读取和解析 XML 文档中的 `` 元素。这样不仅能够提高解析效率,还能减少内存占用。本文将详细介绍如何使用 Pull 解析方法来提取 `` 标签的内容,并提供一个示例代码,帮助开发者快速解决问题。 ... [详细]
  • 通过利用代码自动生成技术,旨在减轻软件开发的复杂性,缩短项目周期,减少冗余代码的编写,从而显著提升开发效率。该方法不仅能够降低开发人员的工作强度,还能确保代码的一致性和质量。 ... [详细]
  • 在当前的软件开发领域,Lua 作为一种轻量级脚本语言,在 .NET 生态系统中的应用逐渐受到关注。本文探讨了 Lua 在 .NET 环境下的集成方法及其面临的挑战,包括性能优化、互操作性和生态支持等方面。尽管存在一定的技术障碍,但通过不断的学习和实践,开发者能够克服这些困难,拓展 Lua 在 .NET 中的应用场景。 ... [详细]
  • 如何在C#中配置组合框的背景颜色? ... [详细]
  • 本文深入探讨了C#中的反射与特性功能。首先,介绍了反射的基本概念,即通过元数据(包括类的方法、属性和字段等)在运行时动态获取和操作程序信息的能力。此外,还详细解析了特性的使用方法及其在代码注解和元数据扩展中的重要作用,为开发者提供了丰富的编程技巧和实践指导。 ... [详细]
  • 在探讨如何在Android的TextView中实现多彩文字与多样化字体效果时,本文提供了一种不依赖HTML技术的解决方案。通过使用SpannableString和相关的Span类,开发者可以轻松地为文本添加丰富的样式和颜色,从而提升用户体验。文章详细介绍了实现过程中的关键步骤和技术细节,帮助开发者快速掌握这一技巧。 ... [详细]
  • 依然最钟爱《People Have the Power》,强烈推荐大家聆听这首经典之作
    尽管今日情绪低落,我在音乐库中反复筛选,最终还是选择了《People Have the Power》来激励自己。这首歌不仅旋律动听,歌词也充满力量,能够带给人正能量。强烈建议大家找来聆听,体验其独特的魅力。《People Have the Power》虽然不是出自专辑《Horses》,但同样是一首不可多得的经典之作。 ... [详细]
  • 本文介绍了一种自定义的Android圆形进度条视图,支持在进度条上显示数字,并在圆心位置展示文字内容。通过自定义绘图和组件组合的方式实现,详细展示了自定义View的开发流程和关键技术点。示例代码和效果展示将在文章末尾提供。 ... [详细]
  • 【问题】在Android开发中,当为EditText添加TextWatcher并实现onTextChanged方法时,会遇到一个问题:即使只对EditText进行一次修改(例如使用删除键删除一个字符),该方法也会被频繁触发。这不仅影响性能,还可能导致逻辑错误。本文将探讨这一问题的原因,并提供有效的解决方案,包括使用Handler或计时器来限制方法的调用频率,以及通过自定义TextWatcher来优化事件处理,从而提高应用的稳定性和用户体验。 ... [详细]
  • Unity3D 中 AsyncOperation 实现异步场景加载及进度显示优化技巧
    在Unity3D中,通过使用`AsyncOperation`可以实现高效的异步场景加载,并结合进度条显示来提升用户体验。本文详细介绍了如何利用`AsyncOperation`进行异步加载,并提供了优化技巧,包括进度条的动态更新和加载过程中的性能优化方法。此外,还探讨了如何处理加载过程中可能出现的异常情况,确保加载过程的稳定性和可靠性。 ... [详细]
author-avatar
Hz956_培子
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有