Piszę moje pierwsze testy jednostek iOS (Xcode 5, iOS 6) i stwierdzam, że wyniki testów jednostkowych różnią się w zależności od tego, co ostatnio zrobiłem w Symulatorze. Na przykład. Klikam użytkownika na mojej liście kontaktów w Symulatorze, a teraz moje dane "ostatnich kontaktów" w UserDefaults mają jeszcze jeden obiekt niż wcześniej, nawet gdy prowadzę testy jednostkowe.Czy NSUserDefault nie powinien być czystym polem do testów jednostkowych?
Do testów jednostkowych, to nie jest czysta, aby mieć domyślne dane losowe użytkownika (jestem przyzwyczajony do testów RoR z własnej czystej dB). Poza tym, chciałbym przetestować określone stany, takie jak puste dane "ostatnich kontaktów".
od patrzenia na pytania związane z tutaj, wydaje mi się kilka możliwych odpowiedzi, że nie jestem zadowolony.
- Próbne UserDefaults do testów jednostkowych! Musiałbym zmodyfikować wiele istniejących klas, aby móc wstrzyknąć tę próbę.
- Wyczyść lub dostosuj UserDefaults w metodzie setUp! Ale wtedy moje dane tworzone pracowicie w ręcznych testach znikną.
- Pogodne lub dostosować UserDefaults w metodzie setup następnie przywrócić te wartości w przerywaniem! Oooo.
Wydaje się, że są niepotrzebnie skomplikowane z powodu czegoś, co powinno być standardową praktyką w testach jednostkowych. Nie chcę powtarzać się w każdym teście jednostkowym. Tak, moje pytania są:
- Czy brakuje mi czegoś, co byłoby pożądane w kwestii sposobu utrzymywania UserDefaults z testów symulacyjnych ad-hoc do testów jednostkowych?
- Czy istnieje konfigurowalny sposób, aby to naprawić, powiedz jakiś sposób, aby ustawić cel testu urządzenia, aby miał inną lokalizację przechowywania dla UserDefaults niż wtedy, gdy użyję symulatora do ręcznego testu?
- W przypadku braku tego, czy istnieje elegancki sposób na zrobienie tego w kodzie?
- Na przykład, mogę mieć MyAppTestCase obiektów dziedziczą z XCTestCase i zastąpić metody setup i przerywaniem zawsze uchylenie następnie przywrócić UserDefaults. Czy to dobry pomysł?
Nie powinieneś testować urządzenia domyślnie, ponieważ nie masz nad nim bezpośredniej kontroli. Test jednostkowy powinien działać na samym atomowym zespole programowym -> nie należy angażować żadnych innych klas ani usług. Twoje podejście brzmi bardziej jak test integracji. Te ostatnie zwykle używałyby pozorowanych interfejsów. – Till
Myślę, że źle zrozumiałeś moje pytanie do. W jaki sposób przeprowadzam testy jednostkowe bez wciągania czegoś, nad czym nie mam bezpośredniej kontroli? Nie zamierzałem pobierać wartości domyślnych użytkownika z prawdziwymi wartościami. – LisaD
Innym rozwiązaniem byłoby użycie architektury izolacyjnej, takiej jak OCMock. Dodaj tak zwany szew do swojej klasy jako właściwość typu NSUserDefaults. Testowana klasa zostanie zainicjowana za pomocą standardowegoUżytkownikaDomyślności przechowywanego we wspomnianej właściwości. W twoim teście możesz nadpisać obiekt domyślny za pomocą makiety/kodu pośredniczącego. –