rspec 2.14语法非常奇怪

时间:2013-11-05 04:41:32

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

我在使用rspec 2.14语法时遇到问题。 RSpec控制器运行良好,但需要不同的语法。

describe Frontend::UsersController, type: :controller do
  describe 'POST "create"' do
    subject { post :create, user: { login: email } }

    context 'with valid attributes' do
      let(:email) { FactoryGirl.attributes_for(:user)[:email] }

      it { expect{ subject }.to change{ User.count }.by(1) }
      it { expect(subject).to redirect_to(root_path) }

为什么更改和重定向方法需要不同的语法?

1 个答案:

答案 0 :(得分:1)

他们没有。你可以改为change(User, :count)。您正在使用的表单在运行该行之前和之后评估该块,并检查该值是否已更改。用英语:

  • 用户数现在是X.
  • create
  • 中致电Frontend::UsersController
  • 之后用户数为Y.
  • 我希望Y等于X + 1.

<强>更新

如果您实际上在讨论的是expect{subject}expect(subject)change期望需要测试一下的更改。由于您正在传递expect一个块,change知道它可以先检查用户数,评估该块(调用subject),然后再次检查用户计数。如果你没有传递一个块,那么当你真正想要开始检查用户数的变化时,这是不明确的。