gpt4 book ai didi

unit-testing - 如何在 F# 中编写异步单元测试方法

转载 作者:行者123 更新时间:2023-12-03 07:46:22 28 4
gpt4 key购买 nike

如何在 F# 中编写异步测试方法?

我引用的是以下code :

[TestMethod]
public async Task CorrectlyFailingTest()
{
  await SystemUnderTest.FailAsync();
}

这是我失败的尝试:

[<Test>]
let ``Correctly failing test``() = async {

SystemUnderTest.FailAsync() | Async.RunSynchronously
}

最佳答案

经过一番研究后,发现这比应有的要困难。 https://github.com/nunit/nunit/issues/34

话虽如此,提到了一种解决方法。这看起来有点蹩脚,但是,看起来将任务委托(delegate)外部声明为成员并利用它是一种可行的解决方法。

线程中提到的示例:

open System.Threading.Tasks
open System.Runtime.CompilerServices

let toTask computation : Task = Async.StartAsTask computation :> _

[<Test>]
[<AsyncStateMachine(typeof<Task>)>]
member x.``Test``() = toTask <| async {
do! asyncStuff()
}

还有

open System.Threading.Tasks
open NUnit.Framework

let toAsyncTestDelegate computation =
new AsyncTestDelegate(fun () -> Async.StartAsTask computation :> Task)

[<Test>]
member x.``TestWithNUnit``() =
Assert.ThrowsAsync<InvalidOperationException>(asyncStuff 123 |> toAsyncTestDelegate)
|> ignore

[<Test>]
member x.``TestWithFsUnit``() =
asyncStuff 123
|> toAsyncTestDelegate
|> should throw typeof<InvalidOperationException>

XUnit 也遇到了类似的问题,并且确实提出了解决方案: https://github.com/xunit/xunit/issues/955

所以你应该能够在 xunit 中执行此操作

[<Fact>]
let ``my async test``() =
async {
let! x = someAsyncCall()
AssertOnX
}

很抱歉,如果这不是最令人满意的答案。

关于unit-testing - 如何在 F# 中编写异步单元测试方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46227709/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com