2017-03-01 1 views
2

Lors du test de panneaux virtualisés, j'ai besoin de définir la propriété VirtualizingPanel.IsVirtualizing afin que Teststack.White puisse interagir avec eux comme avec des panneaux non virtualisés.Définition de `VirtualizingPanel.IsVirtualizing` avec TestStack.White

Ceci m'aide particulièrement quand les panneaux ont beaucoup de contenu.

Je ne veux pas régler VirtualizingPanel.IsVirtualizing de manière statique, donc je n'ai pas besoin de le livrer comme ça à mes clients.

Pour jouer avec un exemple minimal, vous aurez besoin d'une fenêtre.

<Window x:Class="DataGridTest.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:local="clr-namespace:DataGridTest" 
     mc:Ignorable="d" 
     Title="MainWindow" Height="350" Width="525"> 
    <DataGrid 
     AutomationProperties.AutomationId="MyDataGRID" 
     ItemsSource="{Binding MyItems}" 
     VirtualizingPanel.IsVirtualizing="True" > 
     <!--> 
     "IsVirtualizing Defaults to True." 
     "Setting this to False makes the test pass but is a poor choice for production code." 
     "Somehow I need to be able to change this programatically during testing." 
     </!--> 
    </DataGrid> 
</Window> 

Code derrière pour la fenêtre ci-dessus.

using System.Collections.Generic; 
using System.Windows; 

namespace DataGridTest 
{ 
    public class Item 
    { 
     private string str; 
     public Item(string str) { this.str = str; } 
     public string Value { get { return str; } } 
     public int Length { get { return str.Length; } } 
     public int Hash { get { return str.GetHashCode(); } } 
    } 

    public partial class MainWindow : Window 
    { 
     List<Item> myitems; 
     public List<Item> MyItems { get { return myitems; } } 

     public MainWindow() 
     { 
      InitializeComponent(); 

      myitems = new List<Item>(); 
      for (int i = 0; i < 800; ++i) 
      { 
       myitems.Add(new Item($"Item {i}")); 
      } 

      DataContext = this; 
     } 
    } 
} 

Et enfin un projet d'essai:

using NUnit.Framework; 
using System.Diagnostics; 
using TestStack.White; 
using TestStack.White.UIItems; 
using TestStack.White.UIItems.WindowItems; 

namespace NunitTest 
{ 
    [TestFixture] 
    public class Class1 
    { 
     private Application app; 
     private Window window; 

     [OneTimeSetUp] 
     public void OneTimeSetUp() 
     { 
      ProcessStartInfo info = new ProcessStartInfo($"{TestContext.CurrentContext.WorkDirectory}/DataGridTest.exe"); 
      info.WorkingDirectory = TestContext.CurrentContext.WorkDirectory; 
      app = Application.Launch(info); 
      window = app.GetWindow("MainWindow"); 
     } 

     [OneTimeTearDown] 
     public void OneTimeTearDown() 
     { 
      window.Close(); window = null; 
      app.Close(); app = null; 
     } 

     [Test] 
     public void test() 
     { 
      ListView list = window.Get<ListView>("MyDataGRID"); 
      SetIsVirtualizing(list, false); 
      Assert.AreEqual(800, list.Rows.Count, "This fails for virtualized panels"); 
      SetIsVirtualizing(list, true); 
     } 

     private void SetIsVirtualizing(ListView list, bool value) 
     { 
      //insert magic - I tried a couple of things but I just can not set this dependency property 
     } 
    } 
} 

S'il vous plaît aider à être à comprendre comment VirtualizingPanel.IsVirtualizing peut être réglé au cours des essais.

Répondre

0

J'ai réussi à ajouter une zone de texte réduite pour interagir avec le contexte de données. Bien que je suis très mécontent de cette solution, il passe les tests.

Voici les modifications au code que je fait:

fenêtre

<StackPanel> 
    <TextBox 
    AutomationProperties.AutomationId="MyItems_IsVirtualizing_Injector" 
    Text="{Binding MyItems_IsVirtualizing_Injector}" Visibility="Collapsed"/> 
    <DataGrid 
    AutomationProperties.AutomationId="MyDataGRID" 
    ItemsSource="{Binding MyItems}" 
    VirtualizingPanel.IsVirtualizing ="{Binding MyItems_IsVirtualizing}" 
     > 
     <!--> 
    "IsVirtualizing Defaults to True." 
    "Setting this to False makes the test pass but is a poor choice for production code." 
    "Somehow I need to be able to change this programatically during testing." 
    </!--> 
    </DataGrid> 
</StackPanel> 
Code

derrière

string injector = true.ToString(); 
    public event PropertyChangedEventHandler PropertyChanged = delegate { }; 
    public string MyItems_IsVirtualizing_Injector 
    { 
     get { return injector; } 
     set 
     { 
      injector = value; 
      PropertyChanged(this, new PropertyChangedEventArgs("MyItems_IsVirtualizing_Injector")); 
      PropertyChanged(this, new PropertyChangedEventArgs("MyItems_IsVirtualizing")); 
     } 
    } 
    public bool MyItems_IsVirtualizing { get { return string.Equals(true.ToString(), MyItems_IsVirtualizing_Injector); } } 

test

private void SetIsVirtualizing(ListView list, bool value) 
    { 
     var injector = window.Get<TextBox>("MyItems_IsVirtualizing_Injector"); 
     injector.Text = value.ToString(); 
    } 

EDIT: Depuis mon usecase réelle est compte les éléments que je réellement établis pour une autre solution qui peut être appelée à l'aide CountElements(list.AutomationElement)

private static int CountElements(AutomationElement container) 
    { 
     var patterns = container.GetSupportedPatterns(); 
     var itemContainer = container.GetCurrentPattern(ItemContainerPattern.Pattern) as ItemContainerPattern; 

     List<object> elements = new List<object>(); 
     var element = itemContainer.FindItemByProperty(null, null, null); 
     while (element != null) 
     { 
      elements.Add(element); 
      element = itemContainer.FindItemByProperty(element, null, null); 
     } 
     return elements.Count; 
    }