将受歧视的联合传递给InlineData属性

时间:2014-12-31 20:30:21

标签: unit-testing f# 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`` () =

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

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

1 个答案:

答案 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