2016-05-23 13 views
0

Als erstes muss ich sagen, dass ich mich nicht sicher bin, wie ich diese Fragen formulieren soll, da ich neu bei Xamarin bin.Xamarin NUnitLite-Testmethoden: Wie werden geteilte Tests ausgeführt, die auf jeder Plattform ausgeführt werden?

Ich baue eine App in Xamaring mit dem Ziel, Cross Platform zu sein.

Dies sind die Schritte:

  1. Lösung erstellen
  2. Neues Projekt Name: Demo.UI.TestHarness.iOS, Typ: iOS Unified-Unit-Test App
  3. Neues Projekt Name: Demo.UnitTests, Typ: Cross-Platform Tragbarer Bibliothek
  4. Make Demo.UI.TestHarness.iOS das Startprojekt
  5. Nuget Paket NUnitLite-Demo.UnitTests
  6. hinzufügen
  7. Verweis hinzufügen zu Demo.UnitTests in Demo.UI.TestHarness.iOS

Dies geschieht, habe ich eine Klasse DummyTest in Demo.UnitTests:

using System; 
using NUnit.Framework; 

namespace Demo.UnitTests 
{ 
    [TestFixture] 
    public class DummyTest 
    { 
     [Test] 
     public void DUMMY() 
     { 
      Assert.True (false); 
     } 
    } 
} 

Und ich in die Datei UnitTestAppDelegate in Demo.UI.TestHarness.iOS hinzugefügt einen Verweis auf diese DummyTest:

using System; 
using System.Linq; 
using System.Collections.Generic; 

using Foundation; 
using UIKit; 
using MonoTouch.NUnit.UI; 
using Demo.UnitTests; 

namespace Demo.UI.TestHarness.iOS 
{ 
    // The UIApplicationDelegate for the application. This class is responsible for launching the 
    // User Interface of the application, as well as listening (and optionally responding) to 
    // application events from iOS. 
    [Register ("UnitTestAppDelegate")] 
    public partial class UnitTestAppDelegate : UIApplicationDelegate 
    { 
     // class-level declarations 
     UIWindow window; 
     TouchRunner runner; 

     // 
     // This method is invoked when the application has loaded and is ready to run. In this 
     // method you should instantiate the window, load the UI into it and then make the window 
     // visible. 
     // 
     // You have 17 seconds to return from this method, or iOS will terminate your application. 
     // 
     public override bool FinishedLaunching (UIApplication app, NSDictionary options) 
     { 
      // create a new window instance based on the screen size 
      window = new UIWindow (UIScreen.MainScreen.Bounds); 
      runner = new TouchRunner (window); 

      // register every tests included in the main application/assembly 
      // runner.Add (System.Reflection.Assembly.GetExecutingAssembly()); 
      runner.Add(typeof(DummyTest).Assembly); 

      window.RootViewController = new UINavigationController (runner.GetViewController()); 

      // make the window visible 
      window.MakeKeyAndVisible(); 

      return true; 
     } 
    } 
} 

Jetzt kann ich das Projekt erstellen und die Debugger-Simulation ausführen, aber kein t Die meisten kommen auf.

Wenn stattdessen ich die DummyTest direkt in meinem Demo.UI.TestHarness.iOS Projekt hinzufügen und über das Demo.UnitTests Projekt vollständig vergessen, es läuft wie vorgesehen (aber das ist nicht das, was ich will, weil ich die Tests alle zusammen machen will die gleichen Tests später verwenden für Android und Mac und nicht für jede Plattform neu zu machen).

+0

Normalerweise teile ich meine Tests in tragbare Einheitentests (die wie Ihre 'Demo.UnitTests' klingen), die keine Plattformabhängigkeiten haben. Diese Komponententests laufen mit einer NUnit-Bibliothek (nur auf meinem Dev-Rechner, nicht auf Geräten). Für alles, was vom Gerät abhängig ist, schreibe ich die Komponententests direkt in die Unit-Test-App für iOS (oder eine andere Plattform), da ich einen Test, der von einer bestimmten Plattform abhängt, nicht teilen kann. Auf diese Weise werden meine gemeinsamen Tests sehr schnell und einfach ausgeführt. Dies ist nur meine Entscheidung für einen Test. – dylansturg

Antwort

1

Incase jemand fragt, warum dies nicht funktioniert - hier ist das, was meine Forschung führte mich zu: https://forums.xamarin.com/discussion/16909/cant-test-pcl-test-assembly-from-xamarin-android-nunitlite-or-monotouch-nunit-ui

Insbesondere der Beitrag von „Seb Bartholomew“. In seiner Antwort postet er eine Arbeit (die ich noch nicht ausprobiert habe). Das grundlegende Problem ist:

Xamarin.iOS verwendet MonoTouch.NUnitLite, Xamarin.Android verwendet Xamarin.Android.NUnitLite und die PCL verwendet die Basis NUnit Nugget-Paket.

Obwohl die Assemblys die gleichen Namen haben und zu den gleichen Namespaces gehören, sind sie intakt, so dass der Monotouch-Test-Runner die externen [Test] -Attribute nicht erkennt.

+0

Ich wechselte zu XUnit, um die Tests durchzuführen. Sie sind einfach nicht gut in Xamarin Studio integriert, funktionieren aber gut in den verschiedenen Plattformen. – jbssm