尝试调试单元测试的pdb上的UnauthorizedAccessException

时间:2016-07-28 21:49:14

标签: visual-studio debugging f# xunit

如果我在这个方法上放置一个断点,在最后一行,并通过" Debug选择测试"在测试资源管理器中,我在测试程序集的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也是如此。我已经花了很长时间试图解决这个问题,并且正在寻找这方面的提示。无论如何他们在这里:

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 Enterprise 2015 Update 3(版本14.0.25424.00)

2 个答案:

答案 0 :(得分:2)

这有点猜测,但a && b是表达式而不是语句,因此断点不会被击中。 如果测试运行器已经制作了程序集和PDB的卷影副本,那么它可能会在测试完成后尝试删除它 - 但是调试器仍在访问它,导致异常。

答案 1 :(得分:1)

假设你处于相同的位(对于32位项目使用32位xunit runner),我猜测这是打破的原因是因为单元测试应该有签名:unit -> unit或C#terms {{ 1}}。

如果您将第一个示例更改为返回单位,我可以调试void而没有任何问题。现在,为什么你的第二个例子工作,即使它有相同的返回类型,我不知道。也许这个bug与需要分配一个变量以便能够在xunit中用它做什么相关?

a && b