実現したいこと
Codeer Friendlyに入門しました。従来FlaUIを使ってユニットテストしていたのですが事情があってFriendlyに乗り換えようか検討中です。素晴らしいライブラリだと思うので乗り換えたいのですが、ある壁にぶつかっており乗り換えの決心がつかない状況です。掲題の課題が実現できるとありがたいのですが、実現できるか否か、実現できるならばどうすればいいか、アドバイスいただける方いらっしゃるでしょうか?
やりたいことは、テスト対象のLabelにMouse.MouseUpEventが投げられたように見せかけることです。
発生している問題・分からないこと
LabelのRaiseEventメソッドを呼び出してみようとしているのですが「'MouseButtonEventArgs' はシリアル化可能として設定されていません。」というエラーになってしまいます。
該当のソースコード
XAML
1<!-- テスト対象プログラム --> 2<Window x:Class="WpfApp1.MainWindow" 3 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 4 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 5 xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 6 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 7 xmlns:local="clr-namespace:WpfApp1" 8 mc:Ignorable="d" 9 Title="MainWindow" Height="200" Width="300"> 10 <Grid> 11 <Button x:Name="button1" Content="length"> 12 <Button.ContextMenu> 13 <ContextMenu> 14 <Label x:Name="menu1" Content="ft" MouseUp="OnMouseUp"/> 15 <Label Content="m" MouseUp="OnMouseUp"/> 16 </ContextMenu> 17 </Button.ContextMenu> 18 </Button> 19 </Grid> 20</Window> 21
C#
1// テスト対象プログラム 2using System.Diagnostics; 3using System.Windows; 4using System.Windows.Input; 5 6namespace WpfApp1 7{ 8 /// <summary> 9 /// MainWindow.xaml の相互作用ロジック 10 /// </summary> 11 public partial class MainWindow : Window 12 { 13 public MainWindow() 14 { 15 InitializeComponent(); 16 } 17 18 private void OnMouseUp(object sender, MouseButtonEventArgs e) 19 { 20 Debug.WriteLine("OnMouseUp"); 21 } 22 } 23} 24
C#
1// ユニットテストのためのテスト対象プログラムのドライバ 2using System.Windows; 3using System.Windows.Controls.Primitives; 4using Codeer.Friendly.Windows.Grasp; 5using RM.Friendly.WPFStandardControls; 6 7namespace WpfControlLibrary.Tests 8{ 9 internal class WpfApp1Driver 10 { 11 public WindowControl MainWindow { get; private set; } 12 public IWPFDependencyObjectCollection<DependencyObject> LogicalTree { get; } 13 public WPFButtonBase Button1 { get; private set; } 14 15 public WpfApp1Driver(WindowControl w) 16 { 17 MainWindow = w; 18 LogicalTree = w.LogicalTree(); 19 20 var btn = LogicalTree.ByType<ButtonBase>().ByName("button1").Single(); 21 Button1 = new WPFButtonBase(btn); 22 } 23 } 24} 25
C#
1// ユニットテスト 2using Microsoft.VisualStudio.TestTools.UnitTesting; 3 4using Codeer.Friendly.Dynamic; 5using Codeer.Friendly.Windows; 6using Codeer.Friendly.Windows.Grasp; 7using RM.Friendly.WPFStandardControls; 8using System.Diagnostics; 9using System.Windows.Input; 10 11namespace WpfControlLibrary.Tests 12{ 13 [TestClass()] 14 public class WpfApp1Tests 15 { 16 private WindowsAppFriend _app; 17 private WindowControl _win; 18 private WpfApp1Driver _drv; 19 20 [TestInitialize] 21 public void Initialize() 22 { 23 var path = System.IO.Path.GetFullPath(@"..\..\..\WpfApp1\bin\Debug\WpfApp1.exe"); 24 _app = new WindowsAppFriend(Process.Start(path)); 25 _win = _app.IdentifyFromTypeFullName("WpfApp1.MainWindow"); 26 _drv = new WpfApp1Driver(_win); 27 } 28 29 [TestCleanup] 30 public void Cleanup() 31 { 32 _app.Dispose(); 33 34 Process process = Process.GetProcessById(_app.ProcessId); 35 process.CloseMainWindow(); 36 } 37 38 [TestMethod()] 39 public void WpfApp1Test_01() 40 { 41 _drv.Button1.EmulateClick(); 42 43 var contextMenus = _win.VisualTreeWithPopup().ByType("System.Windows.Controls.ContextMenu"); 44 var contextMenu = contextMenus[0]; 45 var labels = contextMenu.LogicalTree().ByType("System.Windows.Controls.Label"); 46 var label = new WPFContentControl(labels[0]); 47 Debug.WriteLine($"label text = {label.Content}"); 48 49 // これでは「MouseButtonEventArgs' はシリアル化可能として設定されていません。」になってしまう。どうすればLabelにMouse.MouseUpEventを通知できるのか? 50 label.Dynamic().RaiseEvent(new MouseButtonEventArgs(Mouse.PrimaryDevice, 0, MouseButton.Right) 51 { 52 RoutedEvent = Mouse.MouseUpEvent, 53 Source = this, 54 }); 55 } 56 } 57} 58
試したこと・調べたこと
- teratailやGoogle等で検索した
- ソースコードを自分なりに変更した
- 知人に聞いた
- その他
上記の詳細・結果
本家サイトを拝見したり、GoogleでCodeer Friendlyのサンプルプログラムをあさったりしたのですが、該当する例を見つけることができていません。
補足
特になし
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2024/09/13 20:46
2024/09/14 00:43