在vs测试资源管理器中运行XUnit测试时,CSLA的WCF使用会导致模拟异常



我们使用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:DevInsightTrunkSourceLibCSLA .NET4.0SourceCslaDataPortalClientWcfProxy.cs:line 162
   at Csla.DataPortal.Fetch(Type objectType, Object criteria) in D:DevInsightTrunkSourceLibCSLA .NET4.0SourceCslaDataPortal.cs:line 245
   at Csla.DataPortal.Fetch[T](Object criteria) in D:DevInsightTrunkSourceLibCSLA .NET4.0SourceCslaDataPortal.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;
    }
}

相关内容

  • 没有找到相关文章

最新更新