2

我需要为 Web 应用程序中的用户角色创建一些测试。为了尽量减少描述,其中一项测试涉及检查是否为用户显示菜单条目。

对于这个测试,我使用了一个名为 UserRoles 的表,如下所示:

sUserName    bDoesntHaveMenuX
User1        1
User2        0
User3        1

bDoesntHaveMenuX 是位类型。

我有一个派生自 ValidationRule 的类,它根据 XPath 表达式检查页面中是否存在特定文本,以定位要查找文本的节点。这个类的公共属性是:

string XPathExpression
string Text
bool FailIfFound

最后一个指示如果找到或未找到文本,规则是否应该失败。

在测试中,我为开头提到的表添加了一个数据源,称为 DS。对于我感兴趣的请求,我添加了我的验证规则类的新实例,具有以下值:

Text=MenuX
XPathExpression=//div[@id='menu']//td
FailIfFound={{DS.UserRoles.bDoesntHaveMenuX}}

不幸的是,这不起作用。原因似乎是数据绑定过程创建了一个上下文变量 DS.UserRoles.bDoesntHaveMenuX 的值为“False”或“True”。该值是一个字符串,因此绑定会导致转换错误。

据我所知,我的选择是:

  1. 更改验证规则以接受 FailIfFound 的字符串。不是一个有效的选项,原因有两个:它是一种黑客行为,并且在其他地方使用了相同的规则。
  2. 制定一个将使用上述规则的新验证规则,并将 FailIfFound 实现为字符串。我也不喜欢这个,原因和上面一样。这是一个黑客。
  3. 在将数据传递给验证规则之前,对测试进行编码并进行适当的转换。我不喜欢这个,因为我更喜欢只有在没有其他方法的情况下才将测试编码。

这让我想到了这个问题。还有其他方法吗?

谢谢你。

4

1 回答 1

1

所以根本问题是您无法控制数据绑定如何处理“位”数据类型,并且它被转换为字符串而不是布尔值。

我能想到的唯一解决方案(遗憾的是,这仍然是一个 hack,但不像将 FailIfFound 更改为字符串那么令人震惊)是创建一个 WebTestPlugin,并在 PreRequestDataBinding 或 PreRequest 事件中,将值从字符串转换为布尔值。不要忘记将插件添加到您的测试中(我犯了一个简单的错误)。

然后,当创建验证规则时,它应该会选择好的新 bool 值并正常工作。

例如

  string val = e.WebTest.Context["DS.UserRoles.bDoesntHaveMenuX"].ToString();
  e.WebTest.Context["DS.UserRoles.bDoesntHaveMenuX"] = (val == "True");

我实际上并没有尝试过这个......希望它有效。


编辑:第二轮......更好的解决方案

  1. 将 FailIfFound 属性更改为字符串(在您提到的子类中),以便它可以与数据绑定一起正常工作。
  2. 实现一个 TypeConverter,它为规则的 PropertyGrid (True, False) 中的属性提供有效值的下拉列表,因此在 GUI 中它看起来与将 FailIfFound 作为布尔值的规则相同。必要时,您仍然可以在框中输入您自己的值(例如用于数据绑定)。
  3. 将包含 TypeConverter 代码的 .dll 的路径添加到测试项目的 References 部分。

这就是我开始做的事情,它比在属性的编辑框中键入“True”或“False”要令人满意得多。

于 2011-10-06T21:03:34.413 回答