F# 单元测试F代码引发空引用异常,为什么?

F# 单元测试F代码引发空引用异常,为什么?,f#,f#-interactive,F#,F# Interactive,我正在使用NUnit测试技术,该技术在尚未出版的《F深海潜水版本12秒》一书中提出。2.2添加测试 下面的代码执行精细编译或与MEMOIZE defined/undefined交互。但是,从GUI NUnit执行单元测试在未定义MEMOIZE的情况下可以正常工作,但在定义MEMOIZE时会出现空引用异常而失败。注意记忆使用闭包。我怀疑发生异常是因为编译器生成的某些初始化代码在NUnit启动时没有执行。你觉得怎么样 open System open System.Collections.Gener

我正在使用NUnit测试技术,该技术在尚未出版的《F深海潜水版本12秒》一书中提出。2.2添加测试

下面的代码执行精细编译或与MEMOIZE defined/undefined交互。但是,从GUI NUnit执行单元测试在未定义MEMOIZE的情况下可以正常工作,但在定义MEMOIZE时会出现空引用异常而失败。注意记忆使用闭包。我怀疑发生异常是因为编译器生成的某些初始化代码在NUnit启动时没有执行。你觉得怎么样

open System
open System.Collections.Generic

open NUnit.Framework 
open FsUnit

let memoize (f: 'T -> 'U) =
    let t = new Dictionary<'T, 'U>(HashIdentity.Structural)
    fun n ->
        if t.ContainsKey n then t.[n]
        else let res = f n
             t.Add(n, res)
             res

//TODO: Insure J>0 & K>0 & J<K
let isMult = 
#if MEMOIZE
    memoize (fun (j,k) -> k % j = 0)
#else
    (fun (j,k) -> k % j = 0)
#endif

type ``Given the isMult function``() = 
    [<TestCase(3,1,false)>]
    [<TestCase(3,2,false)>]
    [<TestCase(3,3,true)>] 
    [<TestCase(5,10,true)>]
    [<TestCase(3,15,true)>]
    [<TestCase(5,13,false)>]
    [<TestCase(5,15,true)>]
    member t.``the result is calculated correctly``(j, k, expected) =         
        let actual = isMult (j,k)        
        actual |> should equal expected

我安装了新的VS 2015预览版。在那种环境中没有什么不同。既然.NET Framework是开源的,也许我可以将调试器精确地归零到mscorlib源代码的问题上。

您是否在多个线程中运行NUnit测试?普通字典不是线程安全的,所以奇怪的事情可能会发生。如果您使用ConcurrentDictionary,它会给出相同的结果吗

let memoize (f: 'T -> 'U) =
    let t = System.Collections.Concurrent.ConcurrentDictionary<'T, 'U>()
    fun n -> t.GetOrAdd(n, f)

我猜您是以.exe而不是.dll编译的,或者测试运行程序违反了一些F假设。您使用的是哪种运行程序?对于我来说,在VS2013中使用内置的运行程序或使用NUnit GUI运行程序,当我定义MEMOIZE时,您的代码按预期工作,我添加了一些打印以确保。Resharper runner也可以工作,但是测试显示了两次,其中一半由于某种原因被跳过。请参阅我的原始帖子的附录。这并没有提供问题的答案。若要评论或要求作者澄清,请在其帖子下方留下评论。-我会的,但是评论不能有多行代码,对吗?
let memoize (f: 'T -> 'U) =
    let t = System.Collections.Concurrent.ConcurrentDictionary<'T, 'U>()
    fun n -> t.GetOrAdd(n, f)