- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我已经到了想编写一个自动化测试来验证绑定(bind)到特定状态下的 View 模型的 WPF View 的内容的地步。
在概念上,它相当简单。创建一个 View 模型,设置它的状态,创建适当的 View ,将 View 添加到窗口,设置 View 的数据上下文,显示窗口,截取屏幕截图,与之前截取的屏幕截图进行比较。此类测试对于检测意外更改以及验证所有 View 实际上都可以无错误地创建非常有用。
但是,创建我的 View 实例被证明是有问题的。它需要一组未包含在 XAML 定义本身中的资源。这些资源在实际应用中包含在应用层的资源字典中,所以在实际应用中创建View的时候,这些资源已经可供它使用了。
当我在我的测试中创建这个 View 的实例时,它会抛出一个 XamlParseException 关于无法找到各种资源(可以理解)。
我不想简单地向 View 本身的 XAML 定义添加适当的资源字典,因为这会增加创建这些 View 对象之一所需的工作量(计算机工作量),以及增加每个所需的内存量实例。我的理解是,这是 ResourceDictionary 没有以这种方式共享的结果。
我试过了:
<Application
x:Class="Blah.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
StartupUri="MainWindow.xaml">
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="Styles.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>
</Application>
<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<SolidColorBrush x:Key="SpecialBrush" Color="Black" />
</ResourceDictionary>
<Window
x:Class="Blah.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:Blah="clr-namespace:Blah"
Title="MainWindow" Height="350" Width="525">
<Grid>
<Blah:View/>
</Grid>
</Window>
<UserControl
x:Class="AutomatedTestUserControlApplicationResources.View"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300">
<Grid Background="{StaticResource SpecialBrush}">
</Grid>
</UserControl>
using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Blah;
using System.Windows;
namespace Blah.Test
{
[TestClass]
public class View_Test
{
[TestMethod]
public void Test()
{
var view = new View();
var window = new Window();
window.Content = view;
window.ShowDialog();
}
}
}
public View(ResourceDictionary resourceContext = null)
{
if (resourceContext != null) Resources.MergedDictionaries.Add(resourceContext);
InitializeComponent();
}
<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="Style/GlobalColour.xaml"/>
<ResourceDictionary Source="Style/GlobalBrush.xaml"/> <!-- Dependent on GlobalColour-->
<ResourceDictionary Source="Style/GlobalStyle.xaml"/>
<ResourceDictionary Source="Resources/GlobalContent.xaml"/>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
最佳答案
这实际上并不是那么难,您只需要使用 Application.LoadComponent创建所有内容的实例,以便在正确的时间提供正确的资源。
关键是通过其 XAML 加载所有内容,而不是创建类的实例,因为类只包含一半的信息。
[TestClass]
public class View_Test
{
[TestMethod]
public void Test()
{
//set initial ResourceAssembly so we can load the App
Application.ResourceAssembly = Assembly.GetAssembly(typeof (App));
//load app
var app = (App) Application.LoadComponent(new Uri("App.xaml", UriKind.Relative));
//load window and assign to app
var mainWindow = (Window) Application.LoadComponent(new Uri("MainWindow.xaml", UriKind.Relative));
app.MainWindow = mainWindow;
//load view and assign to window content
var view = (UserControl) Application.LoadComponent(new Uri("View.xaml", UriKind.Relative));
mainWindow.Content = view;
//show the window
mainWindow.Show();
}
}
Application.ResourceAssembly
并创建
App
并调用
InitializeComponent
在上面。该窗口不是特别必要的,您可以创建一个新窗口来保存 View 。
[TestClass]
public class View_Test
{
[TestMethod]
public void Test()
{
Application.ResourceAssembly = Assembly.GetAssembly(typeof (App));
var app = new App();
app.InitializeComponent();
var mainWindow = new MainWindow();
app.MainWindow = mainWindow;
var view = new View();
mainWindow.Content = view;
mainWindow.Show();
}
}
关于c# - 自动化测试期间的 WPF 组件资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20797116/
关闭。这个问题需要details or clarity .它目前不接受答案。 想改进这个问题吗? 通过 editing this post 添加细节并澄清问题. 关闭 5 年前。 Improve t
背景 我有一个 Azure Runbook(名为 RunStoredProcedure2),定义如下: param( [parameter(Mandatory=$True)] [string] $Sq
我有一个名为“团队”的表,其中包含“非事件”列,另一个表“事件”,其中包含“时间”列。如果任何团队的“事件”中的最新日期发生在 X 时间之前,如何将“非事件”列更新(为 true)? 我知道这可以通过
下面的问题可能有点令人困惑,但我会尽力以最好的方式解释它。 假设我们为一家制造公司工作。它制造然后用于制造产品的组件。在以下示例中,有 3 个组件和 2 个最终产品。 组件和产品的需求如下: comp
我有代码可以让我在一个范围内选择一个项目: COleVariant vItems = cstrAddr; hr = AutoWrap(
我正在开发一个应用程序,该应用程序有 4 种语言的大约 50 个应用内购买,这给了我很多表单和子表单、框和子框,需要使用 iTunesConnect 的令人痛苦且设计糟糕的表单来填充。 我想知道是否有
我想在 Azure 自动化中使用 powershell 脚本来安排打开/关闭资源。 我想在不创建帐户的情况下执行此操作,因为我们的域强制重置密码。我知道自动化帐户会创建一个证书 - 当使用资源管理器(
我尝试从 azure 自动化 run book power shell 自动检索 azure SQL 数据库中的数据。我发现azure自动化帐户的模块中缺少SQL Server模块。我已经导入了该模块
我正在自动化 Outlook,并且需要控制电子邮件的发件人身份。用户将在 Outlook 中设置两个或多个帐户,我需要能够选择从哪个帐户发送电子邮件。有什么想法吗? 需要 Outlook 2003 及
我尝试从 azure 自动化 run book power shell 自动检索 azure SQL 数据库中的数据。我发现azure自动化帐户的模块中缺少SQL Server模块。我已经导入了该模块
假设我有一个网站,我可以(随时)登录并每隔 x 小时提交数据(单击登录后可见的链接),我将如何自动化此过程? 我构建了一个图形用户界面,它为用户(现在是我,为了我自己的方便)提供了一个包含一些信息的界
我正在开发一个程序,它的任务是我们为它定义一些号码(我们的一些手机号码)并且它应该在 Telegram 中注册它们,然后获取发送到该号码的所有消息。如您所知,在 Telegram 中注册需要提供电话号
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 3 年前。 Improve this qu
最近我在处理 CSS Sprite 。一切正常。 我创建了一个 sprite、.css 文件和 html 结构。看起来像 .sprites{ background-image:url
我想为一款名为 Dune 2000 的策略游戏创建一个叠加层。令人讨厌的是,要创建 10 个士兵,每次完成一个都必须单击该图标。没有队列。因此,在不干扰游戏运行方式的情况下,我想听听鼠标移动的声音,当
我是 python 的初学者,我想从自动化开始。以下是我正在尝试执行的任务。 ssh -p 2024 root@10.54.3.32 root@10.54.3.32's password: 我尝试通过
当我将一些 urlencoded Javascript 粘贴到 Firefox 和 Chrome 上的 URL 时,我看到了一些奇怪的事情发生。是否可以使用此技术告诉 Chrome 访问 URL,然后
我需要将大量请求自动提交到基于云的数据库接口(interface) (Intelex)。没有任何方法可以批量提交某些操作,但是提交单个请求所必需的只是让经过身份验证的用户尝试打开 Web 链接。因此,
假设我有一个进程的内存转储。我想对其运行报告,所以基本上我想打开 WinDBG,加载 SOS 并运行一个脚本,该脚本运行一些命令,解析输出,然后基于此运行更多命令。 除了像 SendKeys 这样的
我正在使用 ffmpeg 创建视频剪辑。我想自动化该过程并保存剪辑,而无需手动为要保存的每个文件命名。这是我拥有的代码。它将创建并保存剪辑,但只能使用扩展名和不是名字。 @echo off cd /d
我是一名优秀的程序员,十分优秀!