testing - 如何触发和测试 IObservable 上的事件?

标签 testing asynchronous f#

我正在编写一个基本的 UDP 服务器,用于监听给定端口上的消息,对输入进行一些处理,然后使用处理过的消息触发事件。我想编写向服务器发送消息并验证是否引发了正确事件的测试。

服务器看起来像这样:

type UdpServer() =
    let messageReady = new Event<string>()

    member x.Start () = async {
            let rec loop () =                 
                let message = receiveMessage ()
                messageReceived.Trigger(message)
                return loop ()
            return! loop ()
        }

    member x.MessageReady = messageReady.Publish

我想写一个这样的测试:

[<Test>]
let ``Should process message correctly`` () =
    let server = new UdpServer()
    server.Start() |> Async.Start
    sendMessageToServer "test message"

    // This will wait indefinitely since the message was already sent in the previous line
    let processedMessage = server.MessageReady |> Async.AwaitEvent |> Async.RunSynchronously
    processedMessage |> should be "expected output"

如何向服务器发送消息,然后测试是否触发了 MessageReady 事件 正确吗?我可以使用可变变量来存储值,但这看起来不像 F# 方式:

let mutable processedMessage = ""
server.MessageReady |> Observable.subscribe(fun m -> processedMessage <- m)
sendMessageToServer "test message"
processedMessage |> should be "expected output"

最佳答案

消费 observables 和事件本质上是必要的,因此可以使用 mutables/ref 单元格来检查它们是否被引发。

关于testing - 如何触发和测试 IObservable 上的事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28229782/

相关文章:

angularjs - 使用 $resource 响应测试执行服务的 Controller

f# - 'indeterminate type' 在哪里?

f# - FSharp 函数参数的顺序

testing - QTP 11.0 没有在记录应用程序时生成 systemutil.run 命令

css - 测试 CSS 排版的文章

language-agnostic - 您是否曾经更改过代码而只是进行测试,而不是试图完全理解您所做的更改?

javascript - Dojo JsonRest Promise -- 异步调用的顺序

javascript - 在 Angular 中 forEach 完成后执行命令

javascript - Meteor:在响应 HTTP post 请求之前返回 Promise

f# - 如何尝试在无限有序序列中查找元素?