有没有更好的方法来使用RSpec测试这个Rails控制器?

时间:2014-06-13 23:32:16

标签: ruby-on-rails ruby rspec factory-bot rspec-rails

我有一个帐户模型,可以验证其子域是唯一的。

我正在尝试学习如何使用RSpec测试控制器。

这是我提出的问题,但它与生成的RSpec测试完全不同,我想知道这是否是测试此项的好方法,或者是否有& #39;更好的方式。

我的测试:

describe "POST create" do
    describe "with valid params" do
      it "creates a new Account" do
        original_count = Account.count
        account = FactoryGirl.build(:account, :subdomain => 'newdomain')
        post :create, {:account => account}
        account.save!
        new_count = Account.count
        expect(new_count).to eq(original_count + 1)
      end
...

修改

我忘了指出在我的spec_helper中我有以下代码的事实。由于我处理子域的方式,因此需要它:

config.before(:each, :type => :controller) do
    @account = FactoryGirl.create(:account)
    @user = FactoryGirl.create(:user)
    @request.host = "#{@account.subdomain}.example.com"
    sign_in @user
end

2 个答案:

答案 0 :(得分:4)

通过使用Rspec的expect to change和FactoryGirl的attributes_for(可能需要调整,未经测试):

describe "POST create" do
    describe "with valid params" do
      it "creates a new Account" do
        expect{
          post :create, { account: attributes_for(:account) }
        }.to change{Account.count}.by(1)
      end
...

在单元测试中验证您的唯一子域约束,可能使用shoulda-matchers

describe Account do
  it { should validate_uniqueness_of(:subdomain) }
end

答案 1 :(得分:0)

我会使控制器规范成为真正的单元测试而不涉及数据库。类似的东西:

describe AccountsController do
  describe '#create' do
    it "creates a new Account" do
      account_attrs = FactoryGirl.attributes_for :account
      expect(Account).to receive(:create!).with account_attrs
      post :create, account: account_attrs
     end
  end
end

我还有一个功能规范(或黄瓜方案),它集成测试了AccountsController的帖子所属的整个交互。实际上,如果我有一个快乐路径功能规范/场景,则不需要编写上面的控制器规范,但我需要控制器规范来处理错误路径(比如尝试使用相同的创建Account子域名作为现有的Account)和其他变体,我会通过对数据库调用进行存根和模拟来编写类似于上面的规范。