2016-07-28 3 views
2

このメソッドに最後の行に1つのブレークポイントを設定し、テストエクスプローラの "Debug selected tests"でデバッグすると、テストのpdbにUnauthorizedAccessExceptionが表示されますテストが中止されます。ユニットテストをデバッグしようとするpdbのUnauthorizedAccessException

module Tests 

open System 
open Xunit 

[<Fact>] 
let fact() = 
    let rng = Random() 
    let a = rng.Next() % 2 = 0 
    let b = rng.Next() % 2 = 0 
    a && b // <- breakpoint here 

どこにでもブレークポイントを置くと、うまくデバッグできます。私はその行にブレークポイントを置くことができ、メソッドのどこかにブレークポイントがあればデバッグすることができます。最後のブレークポイントは空になります(生成されたコードと一致しません)。最後の行の&&が重要と思われます。削除すると問題が解消されます。たとえば、このバージョンでは問題は発生しません:

[<Fact>] 
let fact() = 
    let rng = Random() 
    let a = rng.Next() % 2 = 0 
    let b = rng.Next() % 2 = 0 
    let result = a && b 
    result // can put a breakpoint anywhere and debug fine 

私は、私もすべて正確に同じ参照とApp.configファイルを使用して、取り組む他の多くのプロジェクトを含む、特定のソリューションの外REPROことができませんでした。私はすでにかなりの時間をかけてこの問題を解決しようとしており、この時点でヒントを探しています。ここで彼らはとにかく、次のとおりです。

App.configファイル:

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <appSettings> 
    <add key="xunit.methodDisplay" value="method"/> 
    </appSettings> 
    <runtime> 
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
     <dependentAssembly> 
     <assemblyIdentity name="xunit.core" publicKeyToken="8d05b1bb7a6fdb6c" culture="neutral" /> 
     <bindingRedirect oldVersion="0.0.0.0-2.1.0.3179" newVersion="2.1.0.3179" /> 
     </dependentAssembly> 
     <dependentAssembly> 
     <assemblyIdentity name="FSharp.Core" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" /> 
     <bindingRedirect oldVersion="0.0.0.0-4.4.0.0" newVersion="4.4.0.0" /> 
     </dependentAssembly> 
    </assemblyBinding> 
    </runtime> 
</configuration> 

packages.config:

<?xml version="1.0" encoding="utf-8"?> 
<packages> 
    <package id="FSharp.Core" version="4.0.0.1" targetFramework="net46" /> 
    <package id="xunit" version="2.1.0" targetFramework="net46" /> 
    <package id="xunit.abstractions" version="2.0.0" targetFramework="net46" /> 
    <package id="xunit.assert" version="2.1.0" targetFramework="net46" /> 
    <package id="xunit.core" version="2.1.0" targetFramework="net46" /> 
    <package id="xunit.extensibility.core" version="2.1.0" targetFramework="net46" /> 
    <package id="xunit.extensibility.execution" version="2.1.0" targetFramework="net46" /> 
    <package id="xunit.runner.visualstudio" version="2.1.0" targetFramework="net46" /> 
</packages> 

Visual Studioのエンタープライズ2015アップデート3(バージョン14.0.25424.00)

答えて

2

それは当て推量の少しですが、a && b式ではなく文ですので、ブレークポイントがヒットされません。 テストランナーがアセンブリとPDBのシャドウコピーを作成した場合、テストが完了した後にテストランナーが削除しようとする可能性がありますが、デバッガーは依然としてその例外にアクセスしています。

+0

私はApp.configに ''を追加し、本当に 'UnauthorizedAccessException'を取り除きました! 'Microsoft.VisualStudio.TestPlatform.TestExecutor.Core.dll'に' InvalidOperationException'が残っていますが、 '進行中のテスト実行がないため、テスト実行の取り消しはできません。 'が、テストは正常に完了しています。 – Asik

+0

それを聞いて嬉しいです。私はしばしばテストランナーが(処理された)例外を生成するのを見ましたが、ブレークオンスローでデバッグする際には不都合以外の問題は生じませんでした! – marklam

1

あなたがいると仮定すると、同じビット数(32ビットプロジェクトで32ビットxunitランナーを使用)を使用している場合、ユニットテストではシグニチャがある必要があります:unit -> unitまたはC#t erms void

ユニットを返すように最初の例を変更した場合、問題なしでa && bをデバッグできました。今度は同じ戻り値の型を持っていても、2番目の例がうまくいく理由は分かりません。多分、バグはxunitで変数を割り当てる必要があることに関係していますか?

[<Fact>] 
let fact() = 
    let rng = Random() 
    let a = rng.Next() % 2 = 0 
    let b = rng.Next() % 2 = 0 
    a && b // <- breakpoint here works 
    () 
+0

元のテストはFsCheck.Xunit '[]'テストであり、これはboolを返すべきだということを言及しておきます。それが私がその問題に気づいたときです。私はFsCheckをまったく使用しないように単純化しました。 – Asik

関連する問題