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