2008-09-27 10 views
4

J'ai une boîte de message simple dans une application WPF qui est lancé comme ci-dessous:Comment accéder à un MessageBox avec du blanc?

private void Button_Click(object sender, RoutedEventArgs e) 
{ 
    MessageBox.Show("Howdy", "Howdy"); 
} 

je peux obtenir white cliquer sur mon bouton et lancer la boîte de message. UISpy montre comme un enfant de ma fenêtre je ne pouvais pas trouver la méthode pour y accéder.

Comment puis-je accéder à mon MessageBox pour vérifier son contenu?

Répondre

3

Trouvé! La classe de fenêtre a une méthode MessageBox qui fait l'affaire:

 var app = Application.Launch(@"c:\ApplicationPath.exe"); 
     var window = app.GetWindow("Window1"); 
     var helloButton = window.Get<Button>("Hello"); 
     Assert.IsNotNull(helloButton); 
     helloButton.Click(); 
     var messageBox = window.MessageBox("Howdy"); 
     Assert.IsNotNull(messageBox); 
1

Qu'en est-il de recevoir le message dans la boîte de message? Je ne peux pas sembler trouver de toute façon de le faire en blanc. Je pense qu'il est très important d'affirmer que le message est correct.

1

Le code source blanc contient certains projets de tests d'interface utilisateur (pour tester le blanc lui-même).

L'un des tests inclut les tests MessageBox, qui incluent un moyen d'obtenir le message affiché.

[TestFixture, WinFormCategory, WPFCategory] 
public class MessageBoxTest : ControlsActionTest 
{ 
    [Test] 
    public void CloseMessageBoxTest() 
    { 
     window.Get<Button>("buttonLaunchesMessageBox").Click(); 
     Window messageBox = window.MessageBox("Close Me"); 
     var label = window.Get<Label>("65535"); 
     Assert.AreEqual("Close Me", label.Text); 
     messageBox.Close(); 
    } 

    [Test] 
    public void ClickButtonOnMessageBox() 
    { 
     window.Get<Button>("buttonLaunchesMessageBox").Click(); 
     Window messageBox = window.MessageBox("Close Me"); 
     messageBox.Get<Button>(SearchCriteria.ByText("OK")).Click(); 
    } 
} 

De toute évidence, l'étiquette utilisée pour afficher le message texte appartient à la fenêtre affichant le messagebox, et son identification primaire est la valeur maximale de mot (65535).

3

S'il vous plaît essayer cette

 Window messageBox = window.MessageBox(""); 
     var label = messageBox.Get<Label>(SearchCriteria.Indexed(0)); 
     Assert.AreEqual("Hello",label.Text); 
1

window.MessageBox() est une bonne solution !!

Mais cette méthode coincé pendant longtemps si le messagebox ne semble pas. Parfois, je veux vérifier "n'apparaît pas" d'un messagebox (Avertissement, Erreur, etc.). Donc, j'écris une méthode pour définir le timeOut par thread.

[TestMethod] 
public void TestMethod() 
{ 
    // arrange 
    var app = Application.Launch(@"c:\ApplicationPath.exe"); 
    var targetWindow = app.GetWindow("Window1"); 
    Button button = targetWindow.Get<Button>("Button"); 

    // act 
    button.Click();   

    var actual = GetMessageBox(targetWindow, "Application Error", 1000L); 

    // assert 
    Assert.IsNotNull(actual); // I want to see the messagebox appears. 
    // Assert.IsNull(actual); // I don't want to see the messagebox apears. 
} 

private void GetMessageBox(Window targetWindow, string title, long timeOutInMillisecond) 
{ 
    Window window = null ; 

    Thread t = new Thread(delegate() 
    { 
     window = targetWindow.MessageBox(title); 
    }); 
    t.Start(); 

    long l = CurrentTimeMillis(); 
    while (CurrentTimeMillis() - l <= timeOutInMillsecond) { } 

    if (window == null) 
     t.Abort(); 

    return window; 
} 

public static class DateTimeUtil 
{ 
    private static DateTime Jan1st1970 = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); 
    public static long currentTimeMillis() 
    { 
     return (long)((DateTime.UtcNow - Jan1st1970).TotalMilliseconds); 
    } 
} 
Questions connexes