如何解决ValidationRule类属性中的强制转换问题?

时间:2011-09-28 12:18:50

标签: c# visual-studio-2010 .net-4.0 webtest

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

对于此测试,我使用名为UserRoles的表,如下所示:

sUserName    bDoesntHaveMenuX
User1        1
User2        0
User3        1

bDoesntHaveMenuX的类型为bit。

我有一个派生自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 个答案:

答案 0 :(得分:1)

因此,根本问题在于您无法控制数据绑定如何处理“位”数据类型,而是将其转换为字符串而不是bool。

我能想到的唯一解决方案(遗憾的是仍然有点破解,但并不像将FailIfFound更改为字符串那么严重)是创建WebTestPlugin,并在PreRequestDataBinding或PreRequest事件中,从字符串转换值布尔。不要忘记将插件添加到您的测试中(我犯了很多错误)。

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

e.g。

  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作为bool的规则相同。您仍然可以在必要时在框中键入自己的值(例如,用于数据绑定)。
  3. 将包含TypeConverter代码的.dll路径添加到测试项目的References部分。
  4. 这是我开始做的事情,而且比在属性的编辑框中输入'True'或'False'更令人满意。