我有一个Web应用程序,该应用程序通过QueueBackgroundWorkItem在后台进行一些处理。
我正在为应用程序中的功能连接单元测试,当它尝试调用此功能时,出现以下错误:
System.InvalidOperationException occurred
HResult=-2146233079
Message=Operation is not valid due to the current state of the object.
Source=System.Web
StackTrace:
at System.Web.Hosting.HostingEnvironment.QueueBackgroundWorkItem(Func`2 workItem)
比较从单元测试调用它到作为运行中的Web服务器一部分调用它之间的环境,我发现AppDomain/HostingEnvironment是不同的。
如果不进行完整的Web应用程序部署以进行测试,是否可以构造单元测试,以便后台工作项可以在适当的上下文中运行?
最好不要更改现有的目标代码,而只需更改测试代码即可-如果不可能,则可以根据其上下文,使用IOC在适当的后台线程中运行后台工作项。
更新
这可行,尽管可能有更优雅的方法可以做到这一点。如果从托管环境中调用,则基本上只在后台运行它:
private void GetSomeData(SomeCriteria criteria, Dictionary<int, List<Tuple<int, string>>> someParam)
{
if (System.Web.Hosting.HostingEnvironment.IsHosted)
{
System.Web.Hosting.HostingEnvironment.QueueBackgroundWorkItem((token) =>
{
GenerateSomeData(token, criteria, someParam);
});
}
else
{
CancellationToken token = new CancellationToken();
GenerateSomeData(token, criteria, someParam);
}
}
最佳答案
我知道这有点丑陋,但是我最终创建了自己的帮助程序类
public static class BackgroundWorkItemX
{
public static void QueueBackgroundWorkItem(Action<CancellationToken> workItem)
{
try
{
HostingEnvironment.QueueBackgroundWorkItem(workItem);
}
catch (InvalidOperationException)
{
workItem.Invoke(new CancellationToken());
}
}
}
并将所有对QueueBackgroundWorkItem的引用更改为此类
关于c# - Microsoft.VisualStudio.TestTools.UnitTesting中的QueueBackgroundWorkItem,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41862544/