【问题标题】:What does a bang before a variable do?变量前的 bang 有什么作用?
【发布时间】:2013-12-21 00:24:45
【问题描述】:

我正在阅读 RoR 测试指南 (http://guides.rubyonrails.org/testing.html)

在页面下方大约 1/5 处显示“”要查看如何报告测试失败,您可以将失败的测试添加到 post_test.rb 测试用例。”

test "should not save post without title" do
  post = Post.new
  assert !post.save
end

我正在尝试了解在保存后使用 bang (!) 的含义。

在我正在开发的应用程序中,我在模型中进行了验证

validates :post, presence: true
  • 如果我保持原样,则测试通过。
  • 如果我删除 bang 测试失败(因为验证)
  • 如果我在保存后将 bang 移至引发异常(因为验证失败 我认为爆炸会返回错误消息)

那么你能帮我理解一下,前面的砰砰声是做什么的,为什么它会让测试通过?

问题编辑/扩展:为什么第二次测试失败(F)而不是异常(E)

【问题讨论】:

  • 很兴奋。但说真的,它是一个标准的 Ruby 运算符,并且可以跨语言找到。

标签: ruby-on-rails unit-testing validation ruby-on-rails-4 ruby-2.0


【解决方案1】:

爆炸(!)反转post.save的结果

assert post.save 读取断言帖子确实保存

assert !post.save 读取断言帖子保存

查看http://www.tutorialspoint.com/ruby/ruby_operators.htm 的 Ruby 逻辑运算符部分

编辑扩展问题:

assert 寻找一个真实的结果。如果结果为真,则返回该测试的通过。如果结果不正确,则该测试返回失败。

asset 方法的一些伪代码,

def assert(result)
  if result == true
    return 'Pass'
  else
    return 'Fail'
  end
end

assert true

=> 'Pass'

assert false

=> 'Fail'

如果测试或代码中出现异常,test 方法将挽救异常并返回 (E)。

test 方法的一些伪代码,

def test(description, &block)
  begin
    yield
  rescue
    return 'Exception'
  end
end

test 'test description' do
  raise 'An error occurred'
end

=> 'Exception'

【讨论】:

  • 天啊!!多么令人难以置信的明显。哈哈 就在我想我要破解这个坚果的时候,我想起了我是多么的n00b。谢谢你启发我。
  • 不用担心。我已经更新了扩展问题的答案
  • 山姆,再次感谢您。很有帮助。我不确定我是否理解为什么第二个没有抛出异常。第二个(保存)和第三个(保存!)不是都在尝试写入数据库并且验证失败吗?
  • 抱歉,我在这里找到了答案(以防其他人发现它有用)apidock.com/rails/ActiveRecord/Base/save。 “有一系列与保存相关的回调。如果任何 before_* 回调返回 false,则取消操作并保存返回 false。”
【解决方案2】:

! 是逻辑非前缀运算符 - 它与变量或方法无关。

可以概括为:

x            !x
---------    ---------
nil          true
false        true
true         false
<other>      false

(在这种情况下,x 是评估 post.save 的结果。)

【讨论】:

  • 感谢您的回答。这是正确的,但山姆在你之前进去。
猜你喜欢
  • 2011-03-20
  • 1970-01-01
  • 2013-02-14
  • 2020-01-18
  • 2014-10-03
  • 2010-09-20
  • 1970-01-01
  • 2017-07-03
  • 2015-03-05
相关资源
最近更新 更多