Ruby on rails RSpec/Mongoid:希望更改嵌入式模型的计数

Ruby on rails RSpec/Mongoid:希望更改嵌入式模型的计数,ruby-on-rails,rspec,mongoid,Ruby On Rails,Rspec,Mongoid,我有两个Mongoid模型:用户和EmailAccounts。后者嵌入到用户模型中。该配置应该是良好的,因为它通常可以正常工作。 现在,我正在尝试为我的用户编辑表单编写一个集成测试,如下所示: describe 'Add EmailAccount' do it 'Adds an email account', js: true do user = FactoryGirl.create(:user_without_email_accounts) visit edit_user_

我有两个Mongoid模型:用户和EmailAccounts。后者嵌入到用户模型中。该配置应该是良好的,因为它通常可以正常工作。 现在,我正在尝试为我的用户编辑表单编写一个集成测试,如下所示:

describe 'Add EmailAccount' do
  it 'Adds an email account', js: true do
    user = FactoryGirl.create(:user_without_email_accounts)
    visit edit_user_path(user)
    expect{
      click_link 'New Email Account'
      within '.nested-fields' do
        fill_in 'Account Name', with: 'New Email Account'
        fill_in 'Other Field', with: 'Other Data'
      end
      click_button 'Save'
    }.to change(EmailAccount, :count).by(1)
  end
end
由于EmailAccount是嵌入式模型,因此计数的更改始终为0。 我可以用类似的方式检查EmailAccount计数器的变化吗?还是我必须走另一条路? 这也行不通:

      }.to change(user.email_accounts, :count).by(1)

用新答案编辑:

我已经能够在我的Mongoid文档规范中使用以下语法:

expect {
  #action
}.to change { Model.count }.by(1)
请注意,count语句位于括号内,不使用:count参数。

请尝试以下操作:

user.reload
}.to change(user.email_accounts, :count).by(1)

我有完全相同的问题,并设法解决它通过使用一个组合的答案张贴在这里

expect {
  #action 
}.to change { foo.reload.bars.count }.by(1)

对不起,只是断章取义,无法控制好奇心,请再说一遍你的名字:)谢谢你的回答。但它仍然不起作用。我在一个ActiveRecord项目中也有类似的例子,在那里做这样的事情是没有问题的。但不能在mongoid中嵌入文档。我做了一个变通方法,检查resultig respond对象中生成的表行。谢谢,Eric。但它仍然不能用于嵌入式mongodb文档。我在自己的testHi Eric中更新了我的答案。这真的适用于嵌入式模型吗?因为即使在控制台中执行EmailAccount.count操作,也会得到0。这正是我所期望的。我忘了这是一个嵌入式模型特有的。我打印了“Model”来表示您真正正在计算的内容,因此您可以将expect{#action}.to change{user.email_accounts.count}.by(1)Hi Arjan。这就成功了,谢谢!但是它应该是
}。要更改
(没有下划线)。我的代码是
}。要更改(foo.reload.bar,:count)。按(1)
,它不起作用。无论如何,更改为
}。更改{foo.reload.bar.count}.by(1)
就像一个符咒。仍然不确定使用
(..,:count)
{…count}
之间的区别。无论如何,谢谢Arjan。@Phil
change(object,:method)
似乎在缓存对象,然后调用
:method
两次。所以,
foo.reload.bar
似乎被缓存了。