C# 如何解决ValidationRule类中的强制转换问题';财产?

C# 如何解决ValidationRule类中的强制转换问题';财产?,c#,visual-studio-2010,.net-4.0,webtest,C#,Visual Studio 2010,.net 4.0,Webtest,我需要为web应用程序中的用户角色创建一些测试。为了最小化描述,其中一个测试涉及检查是否为用户显示菜单项 对于此测试,我使用一个名为UserRoles的表,如下所示: sUserName bDoesntHaveMenuX User1 1 User2 0 User3 1 bDoesntHaveMenuX是bit类型 我有一个从ValidationRule派生的类,该类基于XPath表达式检查页面中是否存在特定文本,以定位要在其中查找文本的节点。 此

我需要为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”。该值是字符串,因此绑定会导致强制转换错误

就我所能想到的,我的选择是:

  • 将验证规则更改为接受Failifound的字符串。无效 选项,有两个原因:这是一个黑客和相同的规则被用于 其他地方
  • 创建一个新的验证规则,该规则将使用上述规则, 并将failifound实现为字符串。我也不喜欢这样,因为 原因同上。这是一个黑客
  • 在传递数据之前,对测试进行编码并进行适当的转换 对验证规则进行修改。我不喜欢这个,因为我更喜欢 只有在没有其他方法的情况下,才按照编码进行测试
  • 这就引出了我的问题。还有别的办法吗


    谢谢。

    所以最基本的问题是,您无法控制数据绑定如何处理“位”数据类型,它正在转换为字符串而不是布尔值

    我能想到的唯一解决方案(遗憾的是,这仍然是一个小技巧,但没有将Failifound更改为string那么严重)是创建一个WebTestPlugin,并在PreRequestDataBinding或PreRequest事件中,将值从string转换为bool。别忘了将插件添加到测试中(我犯了一个很容易的错误)

    然后,当创建验证规则时,它应该拾取新的bool值并正常工作

    e、 g

    我其实没试过这个。。。希望它能起作用


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

  • 将failifound属性更改为string(在您提到的子类中),这样它就可以与数据绑定一起正常工作
  • 实现一个TypeConverter,它在规则的PropertyGrid(True,False)中为属性提供有效值的下拉列表,因此在GUI中它看起来与FailyFind作为bool的规则相同。必要时,您仍然可以在框中键入自己的值(例如,用于数据绑定)
  • 将包含TypeConverter代码的.dll路径添加到测试项目的“引用”部分

  • 这是我开始做的,比在属性的编辑框中键入“True”或“False”更令人满意。

    谢谢您的回答。使用WebTestPlugin是一个不错的主意,不知怎的,我忘记了但这种方法有两个缺点:1)似乎没有办法(或者我找不到)对ValidationRule的bool属性使用数据绑定。VisualStudio“属性”面板使用“真/假”下拉列表。因此,似乎我必须使用编码的webtest来实现这一点,这是我想要避免的。2) 必须为数据源中的所有布尔列维护上述代码。这也许可以通过反射来解决,但它开始变得非常复杂-/要点。。。没错,除了字符串类型之外,不能对属性进行数据绑定。出于这个原因,尽管它很难看并且需要更多的编码,但在我的自定义规则和插件中,我的大多数属性都使用字符串。关于(2),您可以简单地向WebTestPlugin添加一个属性,该属性采用数据源前缀(例如“DS.UserRoles”),然后专门查找以该字符串开头且具有“True”或“False”值的属性,然后将值转换为bool,如上所述。通过这种方式,它将不需要任何额外的工作就可以用于所有列。这应该是“只查找以该字符串开头的‘上下文参数’”。尽管我无法重现问题中描述的场景(我无法将布尔FailIfFound属性设置为False/True以外的任何值),我认为你的答案在这种情况下是非常相关的,所以我将把它标记为答案。谢谢
      string val = e.WebTest.Context["DS.UserRoles.bDoesntHaveMenuX"].ToString();
      e.WebTest.Context["DS.UserRoles.bDoesntHaveMenuX"] = (val == "True");