【问题标题】:Understanding assert_difference in Ruby on Rails理解 Ruby on Rails 中的 assert_difference
【发布时间】:2018-10-30 18:27:07
【问题描述】:

谁能解释一下这个测试代码的作用? :

assert_difference('Post.count') do
    post :create, :post => { :title => 'Hi', :body => 'This is my first post.'}
end

和:

assert_difference 'ActionMailer::Base.deliveries.size', +1 do
  post :invite_friend, :email => 'friend@example.com'
end

即使我阅读了文档我也无法理解。

谢谢!

【问题讨论】:

    标签: ruby-on-rails


    【解决方案1】:

    assert_difference 验证其第一个参数(可以传递给eval 的字符串)的评估结果在调用它传递的块后发生了一定的变化。上面的第一个例子可以“展开”到:

    before = Post.count # technically, eval("Post.count")
    post :create, :post => { :title => 'Hi', :body => 'This is my first post.'}
    after = Post.count
    assert_equal after, before + 1
    

    【讨论】:

    • 但是为什么第二个例子有 +1 而第一个没有第二个参数?有什么区别?
    • @fayer - 我相信默认是+1。在第二个示例中,他们只是明确说明了这一点。
    【解决方案2】:

    这只是检查以确保指定的任何类型的对象数量都增加了 1。(检查对象是否已添加到 DB 是一种简单的方法)

    【讨论】:

      【解决方案3】:

      这个断言是为了验证第一个参数中的某些/指定的差异。第一个参数应该是一个字符串,即“Post.count”。第二个参数的默认值为 1,您也可以指定其他数字,甚至是负数。欲了解更多详情,请访问: http://api.rubyonrails.org/classes/ActiveSupport/Testing/Assertions.html

      【讨论】:

        【解决方案4】:

        此方法是验证第一个参数和第二个参数之间是否存在数值差异。在大多数情况下,第一个参数是一个类似于“Post.count” 的字符串,第二个参数是一个块。在 Rails 中,这主要用于功能测试,以检查对象是否可以保存在数据库中。逻辑是,在保存新对象之前,该特定表中的记录数必须不同于保存对象后的记录数(准确地说是从 1)。

        【讨论】:

          猜你喜欢
          • 2013-08-25
          • 2019-05-13
          • 2011-01-03
          • 1970-01-01
          • 1970-01-01
          • 2010-09-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多