我是 F# 新手,我正在通过一些练习来学习这门语言。我目前正在尝试做的是为自定义 Castle.Windsor 设施编写单元测试,并且我正在尝试模拟内核以引发“ComponentRegistered”事件。
我使用的工具是 FsUnit/xUnit/Foq。
My Code:
let event = Event<_,_>()
let kernel = Mock<IKernel>()
.SetupEvent(fun k -> <@ k.ComponentRegistered @>)
.Publishes(event.Publish)
.Create()
错误信息:
错误 4 事件“ComponentRegistered”具有非标准类型。如果
此事件是用另一种 CLI 语言声明的,您可能需要访问
此事件使用显式 add_ComponentRegistered 和
事件的remove_ComponentRegistered 方法。如果这个事件是
在 F# 中声明,使事件类型成为以下任一类型的实例
'IDelegateEvent>' 或
'I事件,_>'。 C:\Workbench\EvilDev\evildev.commons\Tests\EvilDev.Commons.Windsor.Tests\Auto
解析器设施规范.fs 35 53 EvilDev.Commons.Windsor.Tests
如何从 F# 模拟/触发此类事件?
这种类型的事件可以使用指定委托事件 http://msdn.microsoft.com/en-us/library/ee370450.aspx:
let event = DelegateEvent<ComponentDataDelegate>()
let kernel =
Mock<IKernel>()
.SetupEventByName("ComponentRegistered")
.Publishes(event.Publish)
.Create()
kernel.add_ComponentRegistered(fun _ _ ->
printf "Bingo"
)
event.Trigger([|"x";Mock.Of<IHandler>()|])
可以使用以下方法通过反射发现事件的添加和删除处理程序类型.GetEvent http://msdn.microsoft.com/en-us/library/w7k6k1z6%28v=vs.110%29.aspx method.
我扩展了 Foq API 以允许按名称指定事件,以便您可以指定事件名称(无类型)来解决非标准事件类型编译器错误。
The 变更集 https://foq.codeplex.com/SourceControl/changeset/475613a0810b添加新的SetupEventByName 方法已提交。如果您现在需要这个,您可以从源代码构建或简单地添加最新的Foq.fs https://foq.codeplex.com/SourceControl/latest#Foq/Foq.fs到你的项目。该功能将出现在 Foq 1.5 中,我将在第二天左右尝试推送。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)