/ / F # Observable - Konwersja strumienia zdarzeń na listę - f #, programowanie funkcjonalne, programowanie reaktywne, obserwowalne

F # Observable - Konwersja strumienia zdarzeń do listy - f #, programowanie funkcjonalne, programowanie reaktywne, obserwowalne

Pisałem test jednostkowy, który weryfikował zdarzenia wystrzelone z klasy. Postępowałem zgodnie ze standardowym wzorcem „IEvent <_>, Publikuj, Wyzwalaj wewnątrz typu FSharp”.

Czy możesz polecić „funkcjonalny” sposób, aby to osiągnąć?

Oto opcje, o których mogę myśleć:

  1. Konwertuj strumień zdarzeń na listę ciągów i porównaj tę listę z oczekiwaną listą
  2. (nie jestem pewien, czy istnieje sposób) Przekształć oczekiwaną listę w strumień zdarzeń i porównaj dwa strumienie.

Znacząco pomoże wskaźnik do wyciętego kodu.

Dzięki!


Edycja 1: Pytanie Marka odpowiadającego:

Oto, co mam teraz:

let expectedFiles = [ "c:a1"
"c:a2" ]

[<Fact>]
let ``Can find files from a folder`` () =
let ad = new FileSearchAdapter()
let foundFiles = ref []
ad.FileFound
|> Observable.scan (fun acc e -> e::acc) []
|> Observable.add (fun acc -> foundFiles := acc)
ad.FindFiles @"c:a"
Assert.Equal<string list>(expectedFiles, !foundFiles)

Wydaje mi się, że problem polega na tym, że [a] użycie komórki referencyjnej [b] the obserwable.add zasadniczo zastępuje referencję dla każdego zdarzenia.

Czy istnieje funkcjonalny sposób na osiągnięcie tego samego?

Odpowiedzi:

3 dla odpowiedzi № 1

Wydarzenia dotyczą efektów ubocznych, więc jest ograniczone, jaki sens ma próba bycia wszystkim Funkcjonalny o tym.

(Tak: możesz budować Reaktywne systemy, w których niezmienne dane o zdarzeniach przepływają przez system, są filtrowane i agregowane po drodze, ale u źródła, że ​​zdarzenie jest wywoływane, jest efektem ubocznym).

Biorąc pod uwagę, że test jednostkowy testuje jednostkę w oderwaniu od jej zależności, testowanie, czy zdarzenia są poprawnie zgłaszane, wykonuje izolowaną, „niefunkcjonalną” część systemu, więc nie sądzę mieć zrobić to w funkcjonalny sposób.

Oto prostsza alternatywa:

open System.Collections.Generic

let ``Can find files from a folder`` () =
let ad = new FileSearchAdapter()
let foundFiles = List<string>()
ad.FileFound.Add(fun (sender, args) -> foundFiles.Add args)

ad.FindFiles "c:a"

let expectedFiles = [ "c:a1"; "c:a2" ]
expectedFiles = (foundFiles |> Seq.toList)

(Ta funkcja testowa jest tylko normalną funkcją, która powraca bool, ale jestem pewien, że wiesz, jak przekonwertować go na test jednostkowy.)