ruby - RSpec -- lambda 用法

标签 ruby ruby-on-rails-3 lambda rspec

有人可以向我解释以下方法之间的区别吗?

it "should create a user" do
    lambda do
        post :create, :user => @attr
    end.should change(User, :count).by(1)
end

这就是目前的方法。这也可以通过下面的方法实现吗?

it "should create a user" do
    post :create, :user => @attr
    response.should change(User, :count).by(1)
end

这些实际上是一样的吗?或者第二个不起作用?因为我遵循的教程似乎尽可能使用 response,但在上述情况下并没有这样做。有人可以解释一下上述两种方法之间的区别,lambda 和 RSpec 的响应是如何工作的吗?谢谢!

最佳答案

如果测试数据库为空,lambda 形式相当于这样做:

User.count.should == 0
post :create, :user => @attr
User.count.should == 1

我相信,如您在第二个示例中所示,在不提供 block 的情况下调用 change 会产生错误。

lambda 形式用于包装一段代码,可用于以更方便的方式设置期望,然后使用前后条件进行测试。在 RSpec 的更新版本中,您还会看到使用 expect 完成此操作:

expect {
  post :create, :user => @attr
}.to change(User, :count).by(1)

关于ruby - RSpec -- lambda 用法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6456365/

相关文章:

ruby - 带 block 的 ENV.fetch 或带第二个参数的区别是什么?

mysql - 在 Rails 3 .where 语句中使用 sql CONTAINS?

C# lambda 表达式 : How *Not* to Defer "Dereference"?

ruby-on-rails - rails - 如何在 View 中呈现 JSON 对象

ruby-on-rails - 关系 "venues"的新行违反了检查约束 "enforce_srid_latlon"

c++ - 为什么需要闭包类型的引用成员?

java - BiFunction - apply 方法应该总是返回第二个参数。为什么?

ruby-on-rails - rails 4 : Saving value as JSON string object/array in PostgreSQL

ruby-on-rails - 如何创建特定于 Rails 的 Rubygem?

css - OS X 10.11 升级后无法将 sass 转换为 css