【问题标题】:Rspec let(:model) + model.reload doesn't reload the modelRspec let(:model) + model.reload 不重新加载模型
【发布时间】:2012-07-20 06:27:19
【问题描述】:
let(:product) { FactoryGirl.create(:product) }

it "should blah" do
  product.name = "a"
  product.save!
  post :update, id: product.id, product: { name: "x" }
  # assuming :update changes the product's name to params[:name]
  product.reload.name.should == "x"
end

should 总是失败,除非我做类似的事情

Product.find(product.id).name.should == "x"

我是不是在滥用let

如果我使用在before :each@product.reload 中创建的@product 就可以了。

【问题讨论】:

  • 这很奇怪。您没有滥用let - 它应该可以按您的预期工作。这是导致实际问题的实际规范吗?我假设不是。如果是这样,请您提供,因为问题可能有点复杂。
  • 您的产品控制器如何知道要更新哪个产品实例?它会抓住最后一个创建的吗?数据库中是否可能已经有产品,而工厂女孩创建的产品不是列表的最后一个?
  • 这可能不是确切的代码,但非常相似(更改了模型名称和属性名称)。它与所有模型都非常一致...
  • 我也遇到了这个问题。花了将近半个小时才意识到。

标签: ruby-on-rails rspec rspec2


【解决方案1】:

如果您在执行规范期间中断并调用self.class.method(:let).source,您会得到类似的结果:

def let(name, &block)
  define_method(name) do
    __memoized.fetch(name) {|k| __memoized[k] = instance_eval(&block) }
  end
end

经过进一步检查,__memoized 只是一个简单的哈希。我不认为这里有什么花哨的事情。您使用的是什么精确版本的 rails 和 rspec?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-26
    • 2012-06-02
    • 2018-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多