2016-08-01 1 views
0

NuGetのXUnit 2.1.0と、対応するランナー、consoleおよびvisualstudioをドキュメント「here」関連するコンテンツ。テストエクスプローラでXUnitテストを実行したときのCSLAs WCFの使用により、偽装例外が発生します

私も使用していますVisual Studioの2015年エンタープライズアップデート2. (私は5歳だと思う?)期限切れの合理的だ唯一のことは、我々は4.0.1にしている、CSLAある

我々は実行DataPortalフェッチを必要とするテストでは、DataPortalフェッチがサーバーに送信されるとすぐにテストが終了します。 WCFは "偽装用の無効なトークン - 複製できません"という "System.ServiceModel.FaultException"をスローします。他のユーザーを偽装しようとするテストはないことに注意することが重要です。 CSLAを使用してDataPortalコールを試みるどのテストでも落ちることが起こります。 私はxunit 1.xから2.xにnugetを使って移動しました。テストをローカルでテストするときにxunitランナーからxunitを実行していましたが、現在は廃止予定です。テストはすべて、xunit 1.x用のGuiとコンソールランナーの両方を使って完璧に動作しました。今我々はxunit 2.xでビジュアルスタジオランナーを使用しなければなりません。

編集:xunit 2.xコンソールランナーをビジュアルスタジオの外から実行すると、テストは2.xでもうまくいきます。動作していないもののビジュアルスタジオ側です。以下

スタックトレース:

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を使用して正常に動作します

答えて

1

これは、Visual Studioテストランナーが現在のユーザープリンシパルを設定する方法の問題であると思います。他のテストランナーのほとんどは、空のGenericPrincipalを使用するように見えますが、VSは現在のプリンシパルを現在のWindows IDの偽装バージョンに設定しているようです。つまり、CSLA.NETがもう一度偽装しようとしたときに表示されているエラーが発生します。に設定するBeforeAfterTestAttributeを設定するhttp://www.ienumerable.it/2015/03/21/Setting-up-good-fixture.html

(上記ブログから適応)のxUnitでこれを解決するために、比較的簡単な方法である:

問題はNUnitのに関連し、このブログの記事で詳しく説明されていますテストが実行される前に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; 
    } 

} 
+0

興味深いことに、興味深いことに、私たちは現在、〜1200単位のテストを行っています。それらのすべてに属性を追加するのは難しいでしょう。これはVisual Studioで動作させる唯一の方法ですか?この属性をすべてのテストに追加しますか? Visual Studioを偽装するのを止める方法はありませんか? – Skintkingle

+0

申し訳ありませんが、VSテストランナーが使用するユーザーを変更する方法はわかりません。いずれかのテストで既にこれを拡張できるBeforeAfterTestAttributeを使用していますか?物事を少し速くするかもしれない。 – Grinden

+0

"[Fact]" - > "[Fact、RequiresGenericPrincipal]"を検索して置き換えますか? – Grinden

関連する問題