- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在为 MVC 5 网络应用程序编写单元测试。我在测试中模拟了 HttpContext.Current
。当运行以下代码形成测试 httpSessionStateAfter
throw
System.AggregateException : One or more errors occurred.
----> System.NullReferenceException : Object reference not set to an instance of an object.
只有在我运行单元测试时才会发生这种情况。当应用程序运行时这项工作正常。我将 Nunit 2.6.3 与 reshaper 测试运行器一起使用。
var httpSessionStateBefour = System.Web.HttpContext.Current.Session;
var Person= await Db.Persons.FirstOrDefaultAsync();
var httpSessionStateAfter = System.Web.HttpContext.Current.Session;
如何解决这个问题?
这就是我模拟 HttpContext 的方式
HttpContext.Current = Fakes.FakeHttpContext();
HttpContext.Current.Session.Add("IsUserSiteAdmin", true);
HttpContext.Current.Session.Add("CurrentSite", null);
public static class Fakes
{
public static HttpContext FakeHttpContext()
{
var httpRequest = new HttpRequest("", "http://stackoverflow/", "");
var stringWriter = new StringWriter();
var httpResponce = new HttpResponse(stringWriter);
var httpContext = new HttpContext(httpRequest, httpResponce);
var sessionContainer = new HttpSessionStateContainer("id", new SessionStateItemCollection(),
new HttpStaticObjectsCollection(), 10, true,
HttpCookieMode.AutoDetect,
SessionStateMode.InProc, false);
httpContext.Items["AspSession"] = typeof (HttpSessionState).GetConstructor(
BindingFlags.NonPublic | BindingFlags.Instance,
null, CallingConventions.Standard,
new[] {typeof (HttpSessionStateContainer)},
null)
.Invoke(new object[] {sessionContainer});
return httpContext;
}
}
最佳答案
首先,我确实建议您尽可能将代码与 HttpContext.Current
隔离;这不仅会使您的代码更易于测试,而且有助于您为 ASP.NET vNext 做好准备,它更像 OWIN(没有 HttpContext.Current
)。
但是,这可能需要进行大量更改,而您可能还没有做好准备。要正确模拟 HttpContext.Current
,您需要了解它的工作原理。
HttpContext.Current
是一个由 ASP.NET SynchronizationContext
控制的每线程变量。这个SynchronizationContext
是一个“请求上下文”,代表当前的请求;它是在收到新请求时由 ASP.NET 创建的。我有一个 MSDN article on SynchronizationContext
如果您对更多细节感兴趣。
正如我在 async
intro blog post 中解释的那样,当您 await
一个 Task
时,默认情况下它将捕获当前的“上下文”并使用它来恢复 async
方法。当 async
方法在 ASP.NET 请求上下文中运行时,await
捕获的“上下文”是 ASP.NET SynchronizationContext
。当 async
方法恢复时(可能在不同的线程上),ASP.NET SynchronizationContext
将在恢复 之前设置
方法。这就是 HttpContext.Current
异步async
/await
在 ASP.NET 主机中的工作方式。
现在,当您在单元测试中运行相同的代码时,行为会有所不同。具体来说,没有 ASP.NET SynchronizationContext
来设置 HttpContext.Current
。我假设您的单元测试方法返回 Task
,在这种情况下,NUnit 根本不提供 SynchronizationContext
。因此,当 async
方法恢复时(可能在不同的线程上),它的 HttpContext.Current
可能不是同一个。
有几种不同的方法可以解决这个问题。一种选择是编写您自己的 SynchronizationContext
来保留 HttpContext.Current
,就像 ASP.NET 一样。一个更简单(但效率较低)的选项是使用 a SynchronizationContext
that I wrote called AsyncContext
,这确保 async
方法将在同一线程上恢复。您应该能够安装 my AsyncEx
library from NuGet然后将您的单元测试方法包装在对 AsyncContext.Run
的调用中。请注意,单元测试方法现在是同步的:
[Test]
public void MyTest()
{
AsyncContext.Run(async () =>
{
// Test logic goes here: set HttpContext.Current, etc.
});
}
关于c# - 等待后 HttpContext.Current 为空(仅在单元测试中),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26118756/
我有一个 jQuery 日期选择器。我想将默认日期设置为“当前月份、当前日期(当前年份-18)”,但在设置 defaultDate 属性时遇到问题。显示的默认年份是 1920 年,据说是 1995 年
我有下面的 C 程序来实现升序链表。问题出在 buildList() 函数中,因此您可以忽略除 main() 和 buildList() 之外的其他函数。 #include #include stru
嗯,想象一下 current.txt 文件: asdf base.txt 文件: asdf 其他.txt文件: asdf 当我进行三向 merge 时 git merge-file current.t
我试图在鼠标悬停时生成一个 :after 伪元素。例如: .email{ width:100px; overflow:hidden; text-overflow:ellipsi
为什么 $('a.current').removeClass('current'); 不适用于此 jquery 选项卡? http://jsfiddle.net/laukstein/ytnw9/8/
我正在创建一个应用程序(Outlook 的 Office 加载项) 我遇到的问题是更新我的屏幕。我知道我需要调用 Dispatcher,但是它在我的 ViewModel 中始终为 null p
我为客户开发网络和移动应用程序。在我当前的架构中,许多资源在 Web 访问和移动访问之间共享。 aspx 页面可以显示在网络上,也可以在移动应用程序中调用 WebView 。我的问题是: WebOpe
我通过调用 IEnumerable.GetEnumerator() 得到了一个枚举器,然后我称它为MoveNext()直到它返回false,然后访问它的Current属性(property)。令我惊讶
我正在尝试动态查找当前运行的函数(此函数)的名称,即 (defun my-func () (remove-hook 'some-hook this-function) (do-
阅读了短语 "The current SynchronizationContext is a property of the current thread" correct" ,我有点懵了…… 在 V
集成 IOS STRIPE TERMINAL SDK对于BBPOS Chipper 2X BT使用 swift 。我们已经开发并测试了该系统,并且运行良好。但是当我们将它交给其他国家的客户时,他们收到
当我在训练期间编写的类上实现 IEnumerable 和 IEnumerator 时,我注意到我需要为属性“Current”指定两个实现。 public class PeopleEnumerator
我原以为对实现了 IEnumerable 的空集合执行以下代码会抛出异常: var enumerator = collection.GetEnumerator(); enumerator.MoveNe
应Application.Current.Shutdown()不用作关闭 WPF 应用程序的最佳实践? 我有一个小的多窗口应用程序,“关机”似乎对我所有的退出命令都很好。但是,我被告知要始终使用 Ap
在 XPath 1.0 中,有一个函数 current() 可以派上用场,当我根据我当时所在的节点引用 XML 中其他地方的节点时。我的 XML 具有如下结构:
在 MVC 中,这两者有什么区别? 它们看起来相同,甚至返回相同的类型/类System.Web.Security.RolePrincipal,但有一些微妙之处。 例如。当针对通过 ClaimsPrin
这个问题在这里已经有了答案: What is the difference between an App and Application in c#.net? (1 个回答) 关闭 7 年前。 这两
我正在为我的团队开发一个代码生成器 (VSIX),在我与 VSIX 可扩展性框架作斗争之后,我打算使用 Roslyn 作为基础引擎。 我的代码生成器目前能够为解决方案生成一个新的 csproj,并且能
为什么 $('a.current').parent('li').addClass('current'); 和 $(this).hasClass('current')。 parent('li').add
当我使用 Xcode 调试我的 iOS 程序时,gdb 将其显示在控制台 View 上,并且没有发生任何错误。 我只想知道输出“Current language: auto; currently ob
我是一名优秀的程序员,十分优秀!