Я пишу тесты для объекта, который принимает вход, объединяет некоторые функции, запускает вход через сложенную функцию и возвращает результат.Точность модульного тестирования функционального состава
Вот очень упрощенный набор объектов и функций, зеркала моего дизайна:
type Result =
| Success of string
let internal add5 x = x + 5
let internal mapResult number =
Success (number.ToString())
type public InteropGuy internal (add, map) =
member this.Add5AndMap number =
number |> (add >> map)
type InteropGuyFactory() =
member this.CreateInteropGuy() =
new InteropGuy(add5, mapResult)
Класс предназначен для использования в C# Interop, которая объясняет структуру, но эта проблему все еще можно применить к любой функции который содержит параметры функции.
У меня возникли проблемы с поиском элегантного способа сохранить детали реализации внутренних функций от ползучести до условий тестирования при тестировании функции компоновки или, другими словами, изолировать одно звено в цепочке, а не проверять выход, когда вход полностью проложен. Если я просто проверю выход, тогда тесты для каждой функции будут зависеть от правильной работы нисходящих функций, и если один из них в конце цепочки перестанет работать, все тесты потерпят неудачу. Лучшее, что я смог сделать, - это заглушить функцию, чтобы вернуть определенное значение, а затем отключить ее нисходящую функцию, сохранить входной сигнал нисходящей функции, а затем утверждать, что сохраненное значение равно выходу оштукатуренной функции:
[<TestClass>]
type InteropGuyTests() =
[<TestMethod>]
member this.``Add5AndMap passes add5 result into map function``() =
let add5 _ = 13
let tempResult = ref 0
let mapResult result =
tempResult := result
Success "unused result"
let guy = new InteropGuy(add5, mapResult)
guy.Add5AndMap 8 |> ignore
Assert.AreEqual(13, !tempResult)
Есть ли лучший способ сделать это или это вообще как проверить композицию в изоляции? Дизайнерские комментарии также оценили.
Как вы можете использовать «InteropGuy» из вашего модульного теста, если он «внутренний»? –
@MarkSeemann атрибут InternalsVisibleTo. Я стараюсь, чтобы моя сборка публично раскрывала 'FSharpFunc', так как она будет потребляться C#. – moarboilerplate
Не делайте этого http://blog.ploeh.dk/2015/09/22/unit-testing-internals По существу, делая это, вы говорите, что все внутренние коды также являются «публичными», по крайней мере, когда речь идет об обслуживании. –