【问题标题】:How to solve cast issues in ValidationRule classes' properties?如何解决 ValidationRule 类的属性中的强制转换问题?
【发布时间】:2011-09-28 12:18:49
【问题描述】:

我需要为 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 的字符串。不是有效的 选项,有两个原因:它是一个 hack 并且使用相同的规则 其他地方。
  2. 创建一个将使用上述规则的新验证规则, 并将 FailIfFound 实现为字符串。我也不喜欢这个,因为 同上的原因。这是一个 hack。
  3. 在传递数据之前对测试进行编码并进行适当的转换 到验证规则。我不喜欢这个,因为我更喜欢 只有在没有其他方法的情况下才将测试编码为编码。

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

谢谢。

【问题讨论】:

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


    【解决方案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”更令人满意。

    【讨论】:

    • 感谢您的回答。使用 WebTestPlugin 是一个好主意,不知怎的,它让我忘记了。 :) 但是这种方法有两个缺点: 1) 似乎没有办法(或者我找不到)将数据绑定用于 ValidationRule 的 bool 属性。 VisualStudio 属性面板强制使用 True/False 下拉菜单。所以看来我必须为此使用编码的 webtest,这是我想避免的。 2) 必须为数据源中的所有布尔列维护上面的代码。这可能会通过反射以某种方式解决,但它开始变得非常复杂。 :-/
    • 好点...你是对的,除了字符串类型之外,你不能对属性进行数据绑定。出于这个原因,即使它很丑陋并且需要更多的编码,我在我的自定义规则和插件中对我的大部分属性都使用了字符串。关于 (2),您可以简单地向您的 WebTestPlugin 添加一个属性,该属性采用数据源前缀(例如“DS.UserRoles”),然后专门查找以该字符串开头并具有“真”或“假”值的属性,然后如上所述将值转换为布尔值。通过这种方式,它将适用于所有列,而无需任何额外的努力。
    • 应该说“只查找以该字符串开头的‘上下文参数’”。
    • 尽管我无法重现我在问题中描述的场景(我无法将布尔 FailIfFound 属性设置为 False/True 以外的任何值),但我认为您的回答非常中肯在这种情况下,我会将其标记为答案。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2023-03-06
    • 2020-03-11
    • 1970-01-01
    • 2016-11-10
    • 2012-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多