【问题标题】:Passing discriminated unions to InlineData attributes将有区别的联合传递给 InlineData 属性
【发布时间】:2015-02-27 20:01:44
【问题描述】:

我正在尝试对解析字符串并返回相应抽象语法树(表示为可区分联合)的解析器进行单元测试。我认为使用 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,请参阅 blog.ploeh.dk/2014/03/14/exude ,否则请参阅 github.com/mausch/Fuchu
  • @MauricioScheffer 实际上我已经看过那篇博文,谢谢你提醒我。但是,R# 的测试运行程序不会在 F# 中选择 Exude 样式测试:/。它在 C# 中工作,但是当“嵌套”测试之一失败时,测试结果表现得很奇怪。
  • 实际上,从头开始。它确实在 F# 中工作,我只是将测试定义为一个值,而不是一个函数。 R# 的测试运行程序将测试用例序列识别为一个单元测试,这有点烦人。 Xunit 控制台运行器没有这个问题。随时发布您的建议作为答案,我很乐意接受。
  • 通常的测试运行者充满了魔法,因此会一直中断。从长远来看,最好避免它们。

标签: unit-testing f# xunit discriminated-union


【解决方案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)

另见similar question,我在其中给出了similar answer

【讨论】:

    猜你喜欢
    • 2016-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-26
    • 1970-01-01
    • 1970-01-01
    • 2021-07-01
    相关资源
    最近更新 更多