所以,我们考虑我们有两个模型,A1和A2,A1 has_many A2,而A2 belongs_to A1。根据ActiveRecord规范,如果您从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问题,但他们不承认这一点。
答案 0 :(得分:0)
您如何在Sinatra应用程序中存储数据?
在ActiveRecord中,a1.a2s
两次都为您提供相同的ActiveRecord::Relation
实例,因此期望被绑定到调用create
的实例。
我的猜测是,在Sinatra a1.a2s
每次调用时都会返回一个新实例,因此期望不会与create
的调用者绑定。
你可以通过运行
测试我的理论a1.a2s.object_id
a1.a2s.object_id
并查看两个ID是否相同。