8

所以我刚刚开始使用 F#,我遇到了一个非常奇怪的问题,当使用 FSharp PowerPack 中的某些方法时,我得到了 System.MissingMethodException。

同一模块中的所有方法都不会发生这种情况。如果我将程序集编译为应用程序而不是类库,也不会发生这种情况。

复制步骤:

  1. 创建 2 个程序集,一个类库和一个应用程序。
  2. 添加 nunit.framework 和 FSharp.PowerPack DLL 作为对这两个程序集的引用。
  3. 在每个程序集中创建以下测试夹具。

    open NUnit.Framework
    
    [<TestFixture>]
    type Tests() = class
    
        [<Test>]
        member self.OfSeq() =
            // Will always succeed
            Matrix.Generic.ofSeq [[1]] |> ignore
    
        [<Test>]
        member self.OfList() =
            // Will fail under certain conditions with a System.MissingMethodException
            Matrix.Generic.ofList [[1]] |> ignore
    end
    
  4. 编译这两个程序集。
  5. 在 NUnit 中打开每个程序集并运行所有测试。

当我这样做时,应用程序运行得很好(所有测试都通过),但类库失败并出现以下异常:

System.MissingMethodException : Method not found: 'Microsoft.FSharp.Math.Matrix`1<!!0> Generic.ofList(Microsoft.FSharp.Collections.FSharpList`1<Microsoft.FSharp.Collections.FSharpList`1<!!0>>)'.
   at Temp2.Tests.OfList()

这里发生了什么?

产生此问题的另一种方法是 matrix.PermuteColumns。

附加信息:

  • 我正在为 .NET 4.5 编译两个程序集
  • 我正在使用 Visual Studio 2012 RC 进行编译
  • 我正在使用 NUnit 版本 2.5.10.11092
  • 我正在使用 FSharp PowerPack 版本 2.1.3.1(尽管 DLL 属性声明它是 2.0.0)

让我知道是否有其他有用的信息。

4

2 回答 2

12

(答案以供将来参考,因为此 Q 是搜索的第一个命中。)

使用 Visual Studio 2013和 Brian 引用的“F# MSTest”在线项目模板,Brian 的建议都没有帮助(首先,测试的目标是一个没有App.Config.

但是我最终发现测试项目设置为使用 F#3 运行时(使用 FSharp.Core V4.3.0.0)。将此更改为 F# v3.1 (FSharp.Core V4.3.1.0) 解决了该问题。

于 2013-08-27T18:38:20.347 回答
3

我想知道这是否与绑定重定向有关。您可能需要将应用程序项目中的 app.config 复制到库项目中。

这听起来类似于我目前正在为 F# 团队博客(可能会在接下来的几周内出现)写一篇关于 MSTest 而不是 NUnit 的已知问题。我会尝试将 app.config 复制到库项目中,如果这不起作用,则在此处使用在线模板进行单元测试:

http://visualstudiogallery.msdn.microsoft.com/51ebe64a-899b-4959-8c24-b0148ed6b264

并另外从 VS 的菜单中选择“TEST\Test Settings\Select Test Settings File”,并将其指向单元测试项目模板中包含的“MSTest.runsettings”文件。我希望这两个调整之一将在 MSTest 案例中修复它。

于 2012-08-10T18:20:49.897 回答