Передача различимых объединений в атрибуты 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)
Смотрите также этот похожий вопрос, в котором я даю аналогичный ответ.