Передача различимых объединений в атрибуты InlineData

Я пытаюсь выполнить модульный тест синтаксического анализатора, который анализирует строку и возвращает соответствующее абстрактное синтаксическое дерево (представленное в виде дискриминированного объединения). Я подумал, что было бы довольно компактно использовать атрибут 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 ответов

Одна из возможностей заключается в использовании xUnit's MemberData приписывать. Недостатком этого подхода является то, что этот параметризованный тест отображается в обозревателе тестов Visual Studio как один тест вместо двух отдельных тестов, поскольку в коллекциях отсутствует xUnit IXunitSerializable interface и 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)

Смотрите также этот похожий вопрос, в котором я даю аналогичный ответ.

Другие вопросы по тегам