2016-12-20 4 views
0

Ich habe eine Android-Anwendung in Visual Studio mit Xamarin. Ich habe einen Emulator im Visual Studio installiert. Die App benutzt txt-Dateien, die ich zuvor auf dem Emulator erstellt habe (File.WriteAllText). Das Problem ist, dass ich Unit-Tests nicht ausführen kann. DependencyService.Get löst einen Fehler aus.Fehler: Sie müssen Xamarin.Forms.Init() aufrufen - Visual Studio Xamarin, Komponententest Fehler

Ich bin nicht sicher, wo ich falsch liege, und was ich hier tun sollte.

Es gibt eine IPersistence-Klasse, die das Laden von Dateimethode gibt.

public interface IPersistence 
    { 
     Task<Player[,]> Load(int x); 
    } 

ich setzte es für Android in einer anderen Klasse:

public class AndroidDataAccess : IPersistence 
{ 
     public async Task<Player[,]> Load(int x) 
     { 
       /*...*/ 
     } 
} 

Unit-Test-Code:

using System; 
using Microsoft.VisualStudio.TestTools.UnitTesting; 
using Model; 
using Persistence; 
using Xamarin.Forms; 
namespace UnitTestProject1 
{ 
    [TestClass] 
    public class Test1 
    { 
     private Model _model; 
     private IPersistence _dataAccess = DependencyService.Get<IPersistence>(); //It throws an error. 
     [TestInitialize] 
     public void Initialize() 
     { 

      _model = new Model(_dataAccess); 
      _model.GameWon += new EventHandler<GameWonEventArgs>(Model_GameWon); 
      _model.GameOver += new EventHandler(Model_GameOver); 
      _model.FieldChanged += new EventHandler<FieldChangedEventArgs>(Model_FieldChanged); 
      _model.GuardChanged += new EventHandler<GuardChangedEventArgs>(Model_GuardChanged); 
     } 
     [TestMethod] 
     public void BasicTest10() 
     { 
     _model.NewGame(10); 
     Assert.AreEqual(4, _model.S); 
     } 
+1

Was testen Sie? Zeig uns deinen Test. – EpicSam

Antwort

0

DependencyService erfordert einen Forms Kontext zu arbeiten. Dies wird normalerweise beim Erstellen des MainActivity für Android oder AppDelegate für iOS erstellt. Für Ihren Test würde ich empfehlen, ein Testgerät für jede Plattform zu erstellen und dann eine Methode zu erstellen, die dataAccess basierend auf der Plattform manuell initialisiert.

[TestFixture(Platform.Android)] 
[TestFixture(Platform.iOS)] 
public class Test1 { 
    ... 
    ... 
    private IPersistence InitialisePersistance(Platform platform) { ... } 
}