2011-09-08 1 views
2

J'ai créé un test d'intégration en utilisant le cadre d'automatisation White. Ceci est le début du test d'intégration:Comment obtenir une instance de White.Core.UIItems.WindowItems.Window qui peut automatiser une fenêtre WPF créée dans un test d'intégration?

var app  = Application.Launch("WPFIntegrationTest.exe"); 
var window = app.GetWindow("MainWindow"); 

Cependant, je voudrais obtenir une instance de White.Core.UIItems.WindowItems.Window sans « lancement » de l'application dans un nouveau processus. Ceci me permettrait alors d'injecter n'importe quelles dépendances que MainWindow a, de sorte que je puisse sélectivement moquer/stub dehors dehors.

À titre d'exemple de ce que je cherche, c'est le code que je souhaite que je pourrais écrire:

var myWindow = new MainWindow(); 
var window = White.Core.UIItems.WindowItems.Window(myWindow); 

Est-il possible que je peux y parvenir en utilisant le cadre de l'automatisation Blanc?

Répondre

1

Il semble que ce que vous décrivez est l'exécution de votre code de test blanc et l'application testée dans le même processus - est-ce le cas?

D'après ce que je peux dire à l'auteur blanc dissuade que - voir la question 9 sur cette FAQ Blanc page:

http://white.codeplex.com/wikipage?title=Other%20questions

Can test blanc dans le même processus que l'application?

Le blanc n'est pas conçu pour fonctionner dans ce mode car cela peut entraîner des problèmes de filetage. En principe, ce n'est pas une bonne idée de coupler le code de test avec l'application sous le code de test car ils évolueraient indépendamment les uns des autres.

encore, peut-être l'article ci-dessous vous aidera à faire ce que vous voulez:

http://msdn.microsoft.com/en-us/magazine/cc163864.aspx

Dans l'article ci-dessus, vérifiez le code "Figure 5 - Lancement de l'application". L'approche de l'auteur ressemble un peu à ce que vous décrivez - son code semble charger un assemblage, l'utiliser pour créer une instance d'un objet Form, puis lancer un thread séparé dans lequel Application.Run est appelé pour lancer la forme.

Une fois que votre AUT est en cours d'exécution, vous devriez pouvoir vous y attacher en utilisant Blanc dans le fil principal.

Peut-être que cette technique vous permettra de commencer à manipuler l'AUT comme vous l'espériez?

Juste pour la commodité est ici la figure 5 de l'article:

static Form LaunchApp(string exePath, string formName) 
{ 
    Thread.Sleep(delay); 
    Assembly a = Assembly.LoadFrom(exePath); 
    Type formType = a.GetType(formName); 
    Form resultForm = (Form)a.CreateInstance(formType.FullName); 
    Thread t = new Thread(new ThreadStart(new AppState(resultForm).RunApp)); 
    t.ApartmentState = ApartmentState.STA; 
    t.IsBackground = true; 
    t.Start(); 
    return resultForm; 
} 

private class AppState 
{ 
    public AppState(Form f) { FormToRun = f; } 
    public readonly Form FormToRun; 
    public void RunApp() 
    { 
    Application.Run(FormToRun); 
    } 
} 
+0

Merci pour la réponse, le projet de loi. Cela ressemble précisément à ce que j'espérais faire. – playitcool

Questions connexes