Ruby - 活动记录查询 - 比较产生误报的变量
Ruby - Active Record Query - Comparing Variables Producing False Positive
警告这是一个新手问题,因为它是我第一次使用 active recored 和 oracle db.Trying 来了解 active record 返回值及其比较运算符。
总而言之,我想获得一个报价 ID,然后与存储在数据库中的报价值进行比较,并进行比较以找出报价是否相同(听起来很简单:))
步骤:
我有一个 html ref 元素值,我从 url 中剥离并存储在 offer_id 中,即 site/offers/XXX0317
创建 get_offer 和 verify_offer 数据库方法
def self.get_offer(offer_id)
@offer_id = offer_id
@offer = find_by_sql "select bonus_offer_id
from my_offers
where BONUS_OFFER_ID = '#{offer_id}'
And ROWNUM <= 1"
@return_value = @offer.first[0]
end
def self.verify_offer_id
if @return_str == @offer_id
puts "Offer loaded and ids match in DB"
else
" No match in db - offer not loaded"
end
end
使用 puts 打印结果:
XXX0317
XXX0317
数据库中不匹配 - 商品未加载
场景通过
我读到返回的数据数组 returns 所有列和值因此使用 first[0]
。我假设返回的 db 值和我的报价 ID 不能直接比较因此 false positve.I 已经尝试使用 .attributes 但不确定如何解决这个问题。
-使用 Watir Webdriver 作为 DSL,如果有任何意义的话
任何帮助都会很棒。
非常重要的是,您要准确了解您在测试中比较的等效项。该测试可能无法捕获您认为应该捕获的内容,因为虽然这两个值在逻辑上对您来说是相同的 (01BXXX0317),但我敢打赌它们完全不同 类.
如果您按以下方式重写该测试:
def self.verify_offer_id
puts "Same class : #{@return_str.class == @offer_id.class}"
puts "Equivalent object: #{@return_str == @offer_id}"
puts "Same String value: #{@return_str.to_s.eql?(@offer_id.to_s)}"
end
...我猜输出是:
Same class : false
Equivalent object: false
Same String value: true
当您将对象传递给 puts
方法时,它们将被强制转换为 String
值,因此在打印时它们看起来是一样的。但实际上,您已经剥离了有关该对象的所有其他内容。
检查上述输出的另一种方法是:
puts "@return_str: #{@return_str.inspect}"
puts "@offer_id : #{@offer_id.inspect}"
这将非常清楚地向您展示两者之间的对象差异。
警告这是一个新手问题,因为它是我第一次使用 active recored 和 oracle db.Trying 来了解 active record 返回值及其比较运算符。
总而言之,我想获得一个报价 ID,然后与存储在数据库中的报价值进行比较,并进行比较以找出报价是否相同(听起来很简单:))
步骤:
我有一个 html ref 元素值,我从 url 中剥离并存储在 offer_id 中,即 site/offers/XXX0317
创建 get_offer 和 verify_offer 数据库方法
def self.get_offer(offer_id) @offer_id = offer_id @offer = find_by_sql "select bonus_offer_id from my_offers where BONUS_OFFER_ID = '#{offer_id}' And ROWNUM <= 1" @return_value = @offer.first[0] end def self.verify_offer_id if @return_str == @offer_id puts "Offer loaded and ids match in DB" else " No match in db - offer not loaded" end end
使用 puts 打印结果:
XXX0317 XXX0317 数据库中不匹配 - 商品未加载
场景通过
我读到返回的数据数组 returns 所有列和值因此使用 first[0]
。我假设返回的 db 值和我的报价 ID 不能直接比较因此 false positve.I 已经尝试使用 .attributes 但不确定如何解决这个问题。
-使用 Watir Webdriver 作为 DSL,如果有任何意义的话
任何帮助都会很棒。
非常重要的是,您要准确了解您在测试中比较的等效项。该测试可能无法捕获您认为应该捕获的内容,因为虽然这两个值在逻辑上对您来说是相同的 (01BXXX0317),但我敢打赌它们完全不同 类.
如果您按以下方式重写该测试:
def self.verify_offer_id
puts "Same class : #{@return_str.class == @offer_id.class}"
puts "Equivalent object: #{@return_str == @offer_id}"
puts "Same String value: #{@return_str.to_s.eql?(@offer_id.to_s)}"
end
...我猜输出是:
Same class : false
Equivalent object: false
Same String value: true
当您将对象传递给 puts
方法时,它们将被强制转换为 String
值,因此在打印时它们看起来是一样的。但实际上,您已经剥离了有关该对象的所有其他内容。
检查上述输出的另一种方法是:
puts "@return_str: #{@return_str.inspect}"
puts "@offer_id : #{@offer_id.inspect}"
这将非常清楚地向您展示两者之间的对象差异。