我有一个帐户模型,可以验证其子域是唯一的。
我正在尝试学习如何使用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
答案 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
)和其他变体,我会通过对数据库调用进行存根和模拟来编写类似于上面的规范。