gpt4 book ai didi

f# - 如何使用 XUnit 2.0 和 FSharp 样式测试捕获输出

转载 作者:行者123 更新时间:2023-12-04 00:58:14 24 4
gpt4 key购买 nike

通常我在 F# 中编写单元测试为

open Swensen.Unquote
open Xunit

module MyTests =

[<Fact>]
let ``SomeFunction should return 10`` () =
let a = SomeFunction()
test <@ a = 10 @>


[<Fact>]
let ``SomeOtherFunction should return 11`` () =
let a = SomeFunction()
test <@ a = 11 @>

如果我希望从 xunit 登录到控制台(根据 http://xunit.github.io/docs/capturing-output.html),需要编写一个构造函数,该构造函数采用 。 ITestOutputHelper 然后使用它代替 Console.WriteLine 和家庭。
using Xunit;
using Xunit.Abstractions;

public class MyTestClass
{
private readonly ITestOutputHelper output;

public MyTestClass(ITestOutputHelper output)
{
this.output = output;
}

[Fact]
public void MyTest()
{
var temp = "my class!";
output.WriteLine("This is output from {0}", temp);
}
}

但是 fsharp 模块是静态类,测试是静态方法。没有构造函数来注入(inject)输出助手。

有没有办法访问当前测试的当前输出助手。我知道我可以将我的 fsharp 测试重写为非静态类,但这是不希望的。

在查看了 XUnit 源代码之后。

https://github.com/xunit/xunit/blob/e64f566b75f93cd3cec27f950759d82832bfe44b/src/xunit.execution/Sdk/Frameworks/Runners/TestClassRunner.cs#L90

我很确定这是一个被忽视的案例。没有将帮助程序注入(inject)静态类。

最佳答案

如果 xUnit 没有任何替代机制来注入(inject)参数,那么我想唯一的选择是将测试定义为 F# 对象类型中的方法。我也更喜欢使用 let 将测试编写为函数,但下面的简单对象类型看起来还不错:

open Swensen.Unquote
open Xunit
open Xunit.Abstractions

type MyTests(output:ITestOutputHelper) =

[<Fact>]
member __.``SomeFunction should return 10`` () =
let a = SomeFunction()
output.WriteLine("Some function returned {0}", a)
test <@ a = 10 @>

如果 xUnit 支持一些其他选项会很好 - 我怀疑他们可能会接受建议,如果这不会太尴尬(也许使用方法参数?)

但除非 xUnit 添加对其他方法的支持,否则我认为您需要将 F# 对象与方法一起使用。

关于f# - 如何使用 XUnit 2.0 和 FSharp 样式测试捕获输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31967975/

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