【问题标题】:Rspec should_receive expectation different behaviour in Sinatra and RailsRspec should_receive 期望 Sinatra 和 Rails 中的不同行为
【发布时间】:2012-09-20 05:34:49
【问题描述】:

所以,让我们假设我们有两个模型,A1 和 A2,并且 A1 has_many A2,而 A2 belongs_to A1。根据 ActiveRecord Spec,如果你从 A1 实例化,并尝试在 a2 集合中创建资源,它会触发异常,说需要保存父级才能保存它:

a1 = A1.new
a1.a2s.create #=> BOOM! Exception

到这里,一切都清楚了。但是现在我对这个案例进行了 Rspec 测试,其中我有一个未保存的 A1 实例,然后我做了:

a1.a2s.should_receive(:create)
a1.a2s.create

这就是牛奶变酸的地方。我在 Sinatra 应用程序和 Rails 应用程序中复制了这些 AR 模型。当我在 Rails 中运行它时,规范会运行,因为期望是匹配的,即使它引发了异常。但是,在 Sinatra 中,它只是引发了异常,而不是接受测试。

谁能告诉我为什么?我认为这是一个 Rspec 问题,但他们不承认这一点。

【问题讨论】:

  • 规范不应引发异常,因为should_receive 捕获对方法的调用并且不会触发它
  • 但这正是 Sinatra 案中发生的情况。你能告诉我这个异常捕获到底发生在哪里吗?
  • 提供你正在测试的代码(模型或控制器),我会给你正确的规范

标签: ruby-on-rails activerecord rspec sinatra rspec2


【解决方案1】:

您如何将数据存储在 Sinatra 应用程序中?

在 ActiveRecord 中,a1.a2s 两次都为您提供相同的 ActiveRecord::Relation 实例,因此期望绑定到调用 create 的实例。

我的猜测是,在 Sinatra 中,a1.a2s 每次被调用时都会返回一个新实例,因此期望不会绑定到 create 的调用者。

你可以通过运行来测试我的理论

a1.a2s.object_id
a1.a2s.object_id

并查看两个 id 是否相同。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多