我正在尝试对解析字符串并返回相应抽象语法树(表示为可区分联合)的解析器进行单元测试。我认为使用 Xunit.Extensions 的属性InlineData
将所有测试用例堆叠在一起会非常紧凑:
[<Theory>]
[<InlineData("1 +1 ", Binary(Literal(Number(1.0)), Add, Literal(Number(1.0))))>]
...
let ``parsed string matches the expected result`` () =
但是,编译器抱怨第二个参数不是文字(如果我理解正确,编译时间常量)。
有解决方法吗?如果不是,那么在将每个案例保留为单独的单元测试的同时构建解析器结果测试的最明智方法是什么?
一种可能性是使用 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)
另请参阅这个类似的问题,其中我给出了类似的答案。