2017-05-26 1 views
2

J'ai le code dans mon modèle de vue comme ci-dessous.Moq Application.Current.MainWindow in C#

private Generate() 
{ 

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

       }; 
} 

Je veux moquer l'objet MainWindow dans mon test unitaire. J'ai essayé

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

mais l'objet MainWindow est toujours null. Est-ce que quelqu'un peut fournir des pointeurs utiles sur ce problème?

Répondre

0

Vous devez probablement placer la ligne new CreateWindow sur un motif d'usine.

Créez une nouvelle classe WindowFactory qui a une seule méthode et une interface correspondante IWindowFactory.

Ensuite, dans votre méthode Generate, appelez la méthode WindowFactory.Create() injectée.

Dans votre test, injectez une IWindowFactory raillée qui renvoie une fausse fenêtre.

public interface IWindowFactory 
{ 
    CreateWindow Create(); 
} 

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

Sur votre modèle de vue ajouter une propriété

public IWindowFactory WindowFactory { get; set; } 

Dans votre Générer méthode

var window = WindowFactory.Create(); 

Ensuite, dans votre test, lorsque vous créez votre modèle de vue, définissez le WindowFactory à un Mock

+0

merci j'ai aidé à se moquer du code bien. Les deux solutions ont fonctionné grâce à – user2459838

1

Vous pouvez créer une interface IMainWindowProvider et une implémentation MainWindowProvider:

public interface IMainWindowProvider 
{ 
    Window GetMainWindow(); 
} 

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

Puis dans votre code actuel de méthode Create, vous pouvez utiliser une instance de ce service (cette instance peut être mis en place au constructeur de votre classe de conteneur que vous voulez tester, et dans l'application, il y aura une instance de la classe MainWindowProvider, par exemple dépendance injectée):

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

Et dans vos tests unitaires vous pouvez IMainWindowProvider moqueront au lieu d'essayer d'application maquette, et la configuration de la maquette de revenir une nouvelle fenêtre plutôt factice.

+0

, j'ai aidé à se moquer du code bien. Les deux solutions ont fonctionné – user2459838