2017-05-26 4 views
2

Ich habe Code in meinem Ansichtsmodell wie folgt.Moq Application.Current.MainWindow in C#

private Generate() 
{ 

// Some code here 
var window = new CreateWindow 
       { 
        Owner = Application.Current.MainWindow 

       }; 
} 

Ich möchte das MainWindow-Objekt in meinem Komponententest verspotten. Ich habe versucht

var app = new Application() 
    mock.SetupGet(x => x._mainWindow) 
       .Returns(It.IsAny<MainWindow>()); 

aber das MainWindow-Objekt ist immer Null.

Kann jemand einige nützliche Hinweise zu diesem Problem geben.

Antwort

0

Sie sollten die Zeile new CreateWindow wahrscheinlich in ein Factory-Muster verpacken.

Erstellen Sie eine neue WindowFactory-Klasse mit einer einzigen Methode und einer entsprechenden IWindowFactory-Schnittstelle.

Dann rufen Sie in Ihrer Generate Methode die injected WindowFactory.Create() -Methode.

Im Test injizieren Sie eine verspottete IWindowFactory, die ein gefälschtes Fenster zurückgibt.

public interface IWindowFactory 
{ 
    CreateWindow Create(); 
} 

public class WindowFactory : IWindowFactory 
{ 
    public CreateWindow Create() 
    { 
    return new CreateWindow { Owner = Application.Current.MainWindow }; 
    } 
} 

Auf Ihrer Ansicht Modell eine Eigenschaft

public IWindowFactory WindowFactory { get; set; } 

In Ihrer Methode generieren

var window = WindowFactory.Create(); 

Dann in Ihrem Test hinzufügen, wenn Sie die Ansicht Modell erstellen, das WindowFactory zu einem Mock gesetzt

+0

danke ich half, den Code gut zu verspotten. Beide Lösungen haben funktioniert – user2459838

1

Sie können eine IMainWindowProvider-Schnittstelle und eine MainWindowProvider-Implementierung erstellen:

public interface IMainWindowProvider 
{ 
    Window GetMainWindow(); 
} 

public class MainWindowProvider : IMainWindowProvider 
{ 
    public Window GetMainWindow() => Application.Current.MainWindow; 
} 

Dann in Ihrem aktuellen Code der Methode Erstellen Sie eine Instanz dieses Dienstes kann (diese Instanz im Konstruktor Ihrer Container-Klasse eingerichtet werden, verwenden können, die Sie testen möchten, und in der Anwendung wird es eine sein Instanz der MainWindowProvider-Klasse, z Abhängigkeit injiziert):

var window = new CreateWindow 
{ 
    Owner = mainWindowProvider.GetMainWindow() 
}; 

Und in Ihren Unit-Tests Sie IMainWindowProvider anstatt zu versuchen, Mock-Anwendung und Setup das modell können ein Dummy neues Fenster statt zurückzukehren.

+0

danke ich half, den Code gut zu verspotten. Beide Lösungen haben funktioniert – user2459838