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ć:
- Konwertuj strumień zdarzeń na listę ciągów i porównaj tę listę z oczekiwaną listą
- (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 № 1Wydarzenia 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.)