Невозможно использовать TestCase с 3 различными функциями - PullRequest
0 голосов
/ 09 июля 2019

Я делаю тесты для трех функций, которые делают одно и то же, используя разные способы (с NUnit и FsUnit). Я хочу использовать TestCase, поэтому мне не пришлось бы копировать / вставлять много кода. У меня это сообщение об ошибке компиляции: «Это недопустимое константное выражение или значение пользовательского атрибута». Есть ли способы решить проблему?

Program.fs

let calculateEvenNumbersWithFilter = ...

let calculateEvenNumbersWithMap = ...

let calculateEvenNumbersWithFold = ...

Tests.fs

open FsUnit
open NUnit.Framework
open Program

[<TestCase(calculateEvenNumbersWithFilter)>]
[<TestCase(calculateEvenNumbersWithFold)>]
[<TestCase(calculateEvenNumbersWithMap)>]
let ``Smoke test`` (func) =
    func [1;2;3;4] |> should equal 2

1 Ответ

0 голосов
/ 10 июля 2019

Это ограничение .NET. Только константы и некоторые ограниченные типы данных могут быть использованы в качестве аргумента для любого атрибута. Это не относится к NUnit.

Конечно, используя атрибуты таким образом, мы подвергли себя этому ограничению, но это проблема для следующей структуры, которую мы разрабатываем.

То, что вы пытаетесь сделать, очень элегантно и (конечно) функционально. NUnit обычно ожидает аргументы данных, а не функциональные аргументы для тестирования. Однако это сработало бы, если бы вы могли передать аргумент.

Способ сделать это - использовать атрибут TestCaseSource. Дайте ему имя статического массива, содержащего ваши три функции, и он должен (в конце концов) работать.

Я сожалею, что не могу перевести ответ в рабочий код F # для вас, но, поскольку вы продвинулись так далеко, держу пари, вы можете понять это. : -)

...