2017-03-01 2 views
2

가상화 된 패널을 테스트 할 때 Teststack.White이 가상화되지 않은 패널과 같이 상호 작용할 수 있도록 VirtualizingPanel.IsVirtualizing 속성을 설정해야합니다.TestStack.White를 사용하여`VirtualizingPanel.IsVirtualizing` 설정하기

특히 패널에 많은 콘텐츠가있는 경우 도움이됩니다.

VirtualizingPanel.IsVirtualizing을 정적으로 설정하고 싶지 않아 고객에게 제공 할 필요가 없습니다.

최소한의 예를 가지고 놀려면 창이 필요합니다.

<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> 

위의 창에 대한 코드입니다.

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; 
     } 
    } 
} 

그리고 마지막으로 테스트 프로젝트

:

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 
     } 
    } 
} 

VirtualizingPanel.IsVirtualizing가 테스트 중에 설정할 수있는 방법을 이해하는 데 도움이 바랍니다.

답변

0

나는 datacontext와 상호 작용하는 축소 된 텍스트 상자를 추가하여 약간의 성공을 거두었습니다. 그 솔루션에 대해 매우 불만 스럽지만 테스트를 통과합니다.

<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> 

코드

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); } } 

뒤에 테스트

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

:

는 여기에 내가 만든 코드를 수정하다

편집 : 내 실제 유스 케이스는 실제로 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; 
    } 
를 사용하여 호출 할 수있는 다른 솔루션에 대한 정착 요소를 계산하기 때문에
관련 문제