Ruby中的Eval运算符用于重构

问题描述 投票:0回答:2

我们正在重构使用Ruby和Selenium编写的自动化脚本,并讨论了在ruby中使用eval运算符来减少代码。这就是我们所拥有的

我有一个方法'ValidateViewPageElements',它是一个getter方法,它从web ui获取所有值,并将它与我们的xml数据存储库进行比较。我还有一个我编写的CustomAssertion类,它包含一个方法'verify_browser_element',它接受实际值(Web对象的值)和期望值,并基本上完成断言应该做的事情。如果值匹配,则会记录成功,如果不匹配,则会记录错误。

def validateViewPageElements()
  CustomAssertion.verify_browser_element_value(complete_field.exists?, false)
  CustomAssertion.verify_browser_element_value(editdarrecord_field.exists?, false)
  CustomAssertion.verify_browser_element_value(addvehicle_field.exists?, false)
end

重构上述代码评论注释之一是使用eval表达式并执行以下操作以最小化代码

def validateViewPageElements()
  array = ["complete_field","editdarrecord_field","addvehicle_field"]
  for i in 0..array.length
    CustomAssertion.verify_browser_element_value(eval array[i].value, false)
  end
end

我已经阅读了一些关于证明使用eval语句及其缺点的文章,但是在上述情况下是否需要使用它。我不使用上述重构的建议如下。 Eval语句每次使用时都会创建一个新字节。 2.它没有向开发人员说明定义方法的内容。 3.引入循环以最小化代码行并不是非常有利。 4.难以在循环中更改期望值,因为它们都必须相同。

在上述情况下是否应该避免eval还有其他原因,或者我的假设是错误的,并且在上面的案例中使用它来将15个断言行减少到5行代码是一个好习惯吗?请帮我。

谢谢。

ruby selenium assert
2个回答
2
投票

在Ruby中使用for循环很简单,使用eval这么简单的东西让我质疑你的评论者的理智。你通常在Ruby中使用迭代器而不是循环,你可以使用send而不是eval

def validateViewPageElements()
  %w[complete_field editdarrecord_field addvehicle_field].each do |m|
    CustomAssertion.verify_browser_element_value(send(m).value, false)
  end
end

我也切换到%w[]的字符串数组,这样的报价噪音更少。


1
投票

为什么不简单:

def validateViewPageElements()
  [complete_field, editarrecord_field, addvehicle_field].each {|field| CustomAssertion.verify_browser_element_value(field.exists?, false)}  
end  
© www.soinside.com 2019 - 2024. All rights reserved.