2016-10-12 2 views
0

Ich versuche Unit-Tests in mein Xamarin PCL-Projekt einzubeziehen.Abhängigkeitsdienst Null Referenzausnahme im Komponententest

Dies ist, was ich im Grunde tue:

Login Seite Klasse:

public bool isUserRemembered() 
    { 
     return DependencyService.Get<IUserDefaults>().getUserRemembered(); 
    } 

    public void setRememberUser(bool check) 
    { 
     DependencyService.Get<IUserDefaults>().setUserRemembered(check); 
    } 

Unittest-Klasse (iOS):

[Test] 
    public void RememberKeyTrueTest() 
    { 
     LoginPage page = new LoginPage(); 
     bool isRemember = true; 

     page.setRememberUser(isRemember); 

     bool value = page.isUserRemembered(); 
     if (value) 
      Pass(); 
     else 
      Fail(); 
    } 

I Null Reference Ausnahme auf dieser Linie erhalten: DependencyService.Get<IUserDefaults>().setUserRemembered(check) .

Funktioniert der Abhängigkeitsdienst mit Komponententests? Oder gibt es Arbeit um ihn herum?

+1

Müssen Sie die Dienste konfigurieren? In jedem Fall ist es keine gute Idee, die Abhängigkeitsauflösung in Logikcode zu machen, stattdessen sollten Sie die Abhängigkeiten während der Konstruktion einfügen, dies wird auch in Tests viel einfacher zu handhaben. Keine versteckten Abhängigkeiten mehr, an die Sie sich in all Ihren Tests "erinnern" müssen. –

+1

[Komponententest mit Xamarin.Forms 'DependencyService] (http://arteksoftware.com/unit-testing-with-xamarin-forms-dependencyservice/) ist [nur ein Google-Konto entfernt] (https://www.google. co.uk/search?q=DependencyService+unit+tests) – stuartd

Antwort

1

Wenn ich Dependency Injection in meinem Code verwende, verwende ich IoC (Inversion Of Control), um die Erstellung der Abhängigkeiten in meinem Produktionscode zu verarbeiten und manuell meine Abhängigkeiten in meinen Komponententests zu erstellen.

Mein Hauptgrund dafür ist, dass es explizit ist. Oft verwende ich ein Mocking-Framework, um gefälschte Instanzen zu erstellen, damit ich die zusätzliche Komplexität nicht möchte.

Ein Vorschlag zu Ihrem getesteten Code, Sie haben eine Abhängigkeit zu Ihrer Klasse für eine Abhängigkeit von Ihrem DependencyService vertauscht. Ich sage nicht, verwenden Sie nicht den DependencyService, aber Sie könnten die Abhängigkeit an Ihren Konstruktor der Klasse übergeben. Dann könnte Ihr Test eine gefälschte Instanz passieren und der Produktionscode würde den DependencyService verwenden, um Ihnen einen IUserDefaults zu geben und ihn zu übergeben. Das würde Ihre Klasse leichter testen.

Verwandte Themen