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