在vs测试资源管理器中运行XUnit测试时,CSLA的WCF使用会导致模拟异常
本文关键字:测试 WCF 异常 模拟 CSLA 资源管理器 vs 运行 XUnit | 更新日期: 2023-09-27 17:59:44
我们使用NuGet的XUnit 2.1.0以及相关的运行程序、控制台和visualstudio,如"使用visualstudio运行测试"标题和相关内容所述。
我还在使用Visual Studio 2015 Enterprise Update 2。唯一过时的是CSLA,我们是4.0.1(我认为是5年前的事了?)
当我们运行任何需要DataPortal获取的测试时,只要DataPortal提取尝试发送到服务器,测试就会失败。WCF抛出一个"System.ServiceModel.FFaultException",声明"模拟的令牌无效-不能重复。"请注意,没有任何测试尝试模拟另一个用户。故障发生在任何试图使用CSLA进行DataPortal调用的测试中。最近,我们通过nuget从xunit 1.x转移到了2.x,在本地测试测试时,我们曾经从xunit运行器运行xunit,但现在已经弃用了。在Xunit1.x的Gui和控制台运行程序中,所有测试都运行得非常好。现在我们必须在Xunit2.x中使用visualstudio运行程序,我们遇到了这个疯狂的异常。
edit:如果您在visualstudio之外运行xunit2.x控制台运行程序,那么2.x上的测试也很好,这是visualstudio方面的问题。
下面的堆栈跟踪:
Server stack trace:
at System.ServiceModel.Channels.ServiceChannel.ThrowIfFaultUnderstood(Message reply, MessageFault fault, String action, MessageVersion version, FaultConverter faultConverter)
at System.ServiceModel.Channels.ServiceChannel.HandleReply(ProxyOperationRuntime operation, ProxyRpc& rpc)
at System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs, TimeSpan timeout)
at System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall, ProxyOperationRuntime operation)
at System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage message)
Exception rethrown at [0]:
at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg)
at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)
at Csla.Server.Hosts.IWcfPortal.Fetch(FetchRequest request)
at Csla.DataPortalClient.WcfProxy.Fetch(Type objectType, Object criteria, DataPortalContext context) in D:'Dev'Insight'Trunk'Source'Lib'CSLA .NET'4.0'Source'Csla'DataPortalClient'WcfProxy.cs:line 162
at Csla.DataPortal.Fetch(Type objectType, Object criteria) in D:'Dev'Insight'Trunk'Source'Lib'CSLA .NET'4.0'Source'Csla'DataPortal.cs:line 245
at Csla.DataPortal.Fetch[T](Object criteria) in D:'Dev'Insight'Trunk'Source'Lib'CSLA .NET'4.0'Source'Csla'DataPortal.cs:line 170
同样,如果我们从另一个测试运行程序运行测试,例如旧的xunit测试运行程序或CruiseControl.Net(我们使用CC.Net进行连续集成,这样可以很好地运行测试)
我认为这更像是Visual Studio测试运行程序设置当前用户主体的方式的问题。大多数其他测试运行程序似乎使用空的GenericPrincipal,而VS则将当前主体设置为当前windows标识的模拟版本。这意味着当CSLA.NET再次尝试模拟它时,您会看到错误。
这篇关于NUnit的博客文章详细讨论了这个问题:http://www.ienumerable.it/2015/03/21/Setting-up-good-fixture.html
使用xUnit(改编自上面的博客)解决这个问题的一个相对简单的方法是在测试运行之前设置BeforeAfterTestAttribute,将其设置为GenericPrincipal,然后恢复原始主体。这保证了它将使用相同的主体运行,而与使用的测试运行程序无关。
public class RequiresGenericPrincipalAttribute : BeforeAfterTestAttribute
{
private IPrincipal _originalPrincipal;
public override void Before(MethodInfo methodUnderTest)
{
_originalPrincipal = System.Threading.Thread.CurrentPrincipal;
System.Threading.Thread.CurrentPrincipal = new GenericPrincipal(new GenericIdentity(""), new String[] { });
base.Before(methodUnderTest);
}
public override void After(MethodInfo methodUnderTest)
{
base.After(methodUnderTest);
System.Threading.Thread.CurrentPrincipal = _originalPrincipal;
}
}