gpt4 book ai didi

c# - 来自 Microsoft.VisualStudio.TestTools.UnitTesting 的 QueueBackgroundWorkItem

转载 作者:太空狗 更新时间:2023-10-29 21:53:02 29 4
gpt4 key购买 nike

我有一个 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/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com