将可区分联合传递给 InlineData 属性

nph*_*phx 7 f# unit-testing xunit discriminated-union

我正在尝试对解析字符串并返回相应抽象语法树(表示为可区分联合)的解析器进行单元测试。我认为使用 Xunit.Extensions 的属性InlineData将所有测试用例堆叠在一起会非常紧凑:

[<Theory>]
[<InlineData("1 +1 ", Binary(Literal(Number(1.0)), Add, Literal(Number(1.0))))>]
...
let ``parsed string matches the expected result`` () =
Run Code Online (Sandbox Code Playgroud)

但是,编译器抱怨第二个参数不是文字(如果我理解正确的话,编译时间常量)。

有解决方法吗?如果不是,那么在将每个案例保持为单独的单元测试的同时构建解析器结果测试的最明智的方法是什么?

Tys*_*ams 1

一种可能性是使用 xUnit 的MemberData属性。这种方法的一个缺点是,此参数化测试在 Visual Studio 的测试资源管理器中显示为一个测试,而不是两个单独的测试,因为集合缺少 xUnit 的IXunitSerializable接口,并且 xUnit 也没有添加对该类型的内置序列化支持。有关详细信息,请参阅xunit/xunit/issues/429 。

这是一个最小的工作示例。

module TestModule

  open Xunit

  type DU = A | B | C

  type TestType () =
    static member TestProperty
      with get() : obj[] list =
        [
          [| A; "a" |]
          [| B; "b" |]
        ]

    [<Theory>]
    [<MemberData("TestProperty")>]            
    member __.TestMethod (a:DU) (b:string) =
      Assert.Equal(A, a)
Run Code Online (Sandbox Code Playgroud)

另请参阅这个类似的问题,我在其中给出了类似的答案