F# 为什么在初始化带有选项的记录时会收到错误?
为什么在初始化带有选项的记录时会收到错误 以下行未通过我的单元测试:F# 为什么在初始化带有选项的记录时会收到错误?,f#,assembly-binding-redirect,F#,Assembly Binding Redirect,为什么在初始化带有选项的记录时会收到错误 以下行未通过我的单元测试: let name = { First=String20("Scott"); Last=String20("Nimrod"); Suffix=None } module CreateModuleViewModel.Tests open FsUnit open NUnit.Framework open UILogic.State open CreateModule.UILogic open ManageModule.
let name = { First=String20("Scott"); Last=String20("Nimrod"); Suffix=None }
module CreateModuleViewModel.Tests
open FsUnit
open NUnit.Framework
open UILogic.State
open CreateModule.UILogic
open ManageModule.Entities
[<Test>]
let ``submit module`` () =
// Setup
let viewModel = CreationViewModel()
let name = { First=String20("Scott"); Last=String20("Nimrod"); Suffix=None }
let duration = { Hours=1; Minutes=30; Seconds=0 }
let moduleItem = { Author=name; Duration=duration }
// Tets
viewModel.Add(moduleItem)
// Verify
viewModel.Modules.Head = moduleItem |> should equal true
type String20 = String20 of string
type Name = {
First:String20
Last:String20
Suffix:String20 option
}
测试结果:
let name = { First=String20("Scott"); Last=String20("Nimrod"); Suffix=None }
module CreateModuleViewModel.Tests
open FsUnit
open NUnit.Framework
open UILogic.State
open CreateModule.UILogic
open ManageModule.Entities
[<Test>]
let ``submit module`` () =
// Setup
let viewModel = CreationViewModel()
let name = { First=String20("Scott"); Last=String20("Nimrod"); Suffix=None }
let duration = { Hours=1; Minutes=30; Seconds=0 }
let moduleItem = { Author=name; Duration=duration }
// Tets
viewModel.Add(moduleItem)
// Verify
viewModel.Modules.Head = moduleItem |> should equal true
type String20 = String20 of string
type Name = {
First:String20
Last:String20
Suffix:String20 option
}
结果堆栈跟踪:在CreateModuleViewModel.Tests.submit module()处
结果消息:System.MissingMethodException:未找到方法:
'Void Name..ctor(String20,String20,
Microsoft.FSharp.Core.FSharp选项'1')
测试如下:
let name = { First=String20("Scott"); Last=String20("Nimrod"); Suffix=None }
module CreateModuleViewModel.Tests
open FsUnit
open NUnit.Framework
open UILogic.State
open CreateModule.UILogic
open ManageModule.Entities
[<Test>]
let ``submit module`` () =
// Setup
let viewModel = CreationViewModel()
let name = { First=String20("Scott"); Last=String20("Nimrod"); Suffix=None }
let duration = { Hours=1; Minutes=30; Seconds=0 }
let moduleItem = { Author=name; Duration=duration }
// Tets
viewModel.Add(moduleItem)
// Verify
viewModel.Modules.Head = moduleItem |> should equal true
type String20 = String20 of string
type Name = {
First:String20
Last:String20
Suffix:String20 option
}
为什么我会收到此错误?导致
MissingMethodException
的最常见原因是,您的某些依赖项是根据与单元测试库不同的FSharp.Core.dll版本编译的
解决此问题的方法是将bindingRedirect
添加到app.config
。我认为大多数单元测试运行者也会尊重绑定重定向,因此这应该可以解决问题
马克·希曼。借鉴他的例子,你需要这样的东西:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="FSharp.Core"
publicKeyToken="b03f5f7f11d50a3a"
culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-99.99.99.99"
newVersion="4.3.1.0"/>
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>
新版本将是4.3.1.0
(Visual Studio 2013)或4.4.0.0
(Visual Studio 2015)。我将这里的oldVersion
更改为一个范围,该范围应包括可能存在的所有版本
这导致MethodMissingException
的原因有点微妙,但没有重定向,从一个F#Core运行的选项
与从另一个版本的F#Core运行的选项
不同,因此它无法找到它所期望的方法。导致MissingMethodException
的最常见原因是您的某些依赖项是根据不同版本的FSharp.Core.dll
大于单元测试库
解决此问题的方法是将bindingRedirect
添加到app.config
。我认为大多数单元测试运行者也会尊重绑定重定向,因此这应该可以解决问题
马克·希曼。借鉴他的例子,你需要这样的东西:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="FSharp.Core"
publicKeyToken="b03f5f7f11d50a3a"
culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-99.99.99.99"
newVersion="4.3.1.0"/>
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>
新版本将是4.3.1.0
(Visual Studio 2013)或4.4.0.0
(Visual Studio 2015)。我将这里的oldVersion
更改为一个范围,该范围应包括可能存在的所有版本
这导致MethodMissingException
的原因有点微妙,但没有重定向,一个F#Core的运行时事物,例如option
,与另一个版本的F#Core的option
不同,因此它无法找到它所期望的方法。测试和类型定义在不同的程序集中吗?如果是,您确定在运行时调用了提供类型定义的dll的正确版本吗?我看不出与代码相关的原因使您遇到此错误。某些地方的程序集版本肯定是错误的。谢谢。我的测试项目设置为F#3.1并锁定到该版本,而我的所有其他库都是F#4.0.Scott,从测试项目中删除对FSharp.Core的引用,从packages.config文件中删除FSharp.Core,然后从程序集列表中重新添加正确版本的FSharp.Core,可以在分机下找到。谢谢他们的灯光。我现在正在为我的测试项目与所有这些NuGet依赖性作斗争。我所有的测试都失败了,我仍在努力让我所有的项目都开心。我按照您的指示,在我的属性窗口中观察到我的测试项目的FSharp.Core版本设置为“True”。因此,我的所有其他项目都将版本设置为“4.0”。我现在试图找出FsUnit:找不到与“FsUnit 1.4.1约束:FSharp.Core”兼容的“FSharp.Core”版本(≥ 3.1.2.5).试验和类型定义是否在不同的组件中?如果是,您确定在运行时调用了提供类型定义的dll的正确版本吗?我看不出与代码相关的原因使您遇到此错误。某些地方的程序集版本肯定是错误的。谢谢。我的测试项目设置为F#3.1并锁定到该版本,而我的所有其他库都是F#4.0.Scott,从测试项目中删除对FSharp.Core的引用,从packages.config文件中删除FSharp.Core,然后从程序集列表中重新添加正确版本的FSharp.Core,可以在分机下找到。谢谢他们的灯光。我现在正在为我的测试项目与所有这些NuGet依赖性作斗争。我所有的测试都失败了,我仍在努力让我所有的项目都开心。我按照您的指示,在我的属性窗口中观察到我的测试项目的FSharp.Core版本设置为“True”。因此,我的所有其他项目都将版本设置为“4.0”。我现在试图找出FsUnit:找不到与“FsUnit 1.4.1约束:FSharp.Core”兼容的“FSharp.Core”版本(≥ 3.1.2.5)谢谢Tomas。我的考试现在通过了。但是,我以前通过的所有其他测试现在都失败,并显示相同的错误消息。我正在研究提供的博客,但尚未确定所需的应用程序配置以解决所有dll冲突。有什么建议吗?已将BindingRedirect的新版本属性从newVersion=“4.3.1.0”更新为:newVersion=“4.4.0.0”。我还按照Innerlight的建议,在测试项目上更新了我的FSharp.Core dll,使其指向FSharp4.0。我不确定我是否理解您的配置。其他测试在同一个项目中吗?现在已经解决了。请参考我之前的评论。再次谢谢你,托马斯。我的考试现在通过了。但是,我以前通过的所有其他测试现在都失败,并显示相同的错误消息。我正在研究提供的博客,但尚未确定所需的应用程序配置以解决所有dll冲突。有什么建议吗?更新的新版本属性