2015-09-30 39 views
0

使用RSPEC和DEVISE,我可以登录user来运行我的测试。但是,我最近遇到了一个问题,因为使用before :each会导致创建多个用户,这会导致我的测试中断。登录用户,无需在rspec中创建多个用户

我应该改变我的测试方法吗?或者改变我的用户签名方法?

campaign_controller_spec.rb

before :each do 
    @user = FactoryGirl.create(:user) 
    sign_in :user, @user 
    @business = FactoryGirl.create(:business, user: @user) 
end 

describe "GET #index" do 
    before :each do 
    FactoryGirl.create(:active_campaign, business: @business) 
    FactoryGirl.create(:inactive_campaign, business: @business) 
    end 

    it "no status or type filter" do 
    get :index         # <- LINE 22 OF ERROR 
    expect(assigns(:campaigns).size).to eq 2 
    end 

    it 'status filter' do 
    get :index, status: 'active' 
    expect(assigns(:campaigns).size).to eq 1 
    end 
end 

campaigns_controller.rb

def index 
    # Get current user's campaigns 
    @campaigns = current_user.business.campaigns 

    # Filter by status (constraints are in routes) 
    @campaigns = @campaigns.send(params[:status]) unless params[:status] == 'all' # <- LINE 7 OF ERROR 
end 

的问题是,所有的活动都属于business与属于USER-1规范,但在控制器中,这些广告系列属于另一个用户(因为有多个用户正在创建),因此没有任何广告系列相关联。

确切的错误是:

1) CampaignsController [Signed in] GET #index no status or type filter 
    Failure/Error: get :index 
    TypeError: 
     nil is not a symbol nor a string 
    # ./app/controllers/campaigns_controller.rb:7:in `index' 
    # ./spec/controllers/campaigns_controller_spec.rb:22:in `block (4 levels) in <top (required)>' 

小更新

我有安装了Database Cleaner宝石,应清除测试之间的DB。下面是配置(以防万一它是不正确的):

#DatabaseCleaner 
config.before(:suite) do 
    DatabaseCleaner.strategy = :transaction 
    DatabaseCleaner.clean_with(:truncation) 
end 

config.before(:each) do 
    DatabaseCleaner.start 
end 

config.after(:each) do 
    DatabaseCleaner.clean 
end 

回答

1

当使用factory_girl你要使用类似database_cleaner宝石清洁测试之间的数据库。退房:

https://github.com/DatabaseCleaner/database_cleaner#user-content-rspec-example

编辑:

意识到你的错误不是由你认为它引起的。这是因为你在.send(params[:status])params[:status]为零,因为它没有传递给get :index ......所以一旦调用.send(nil)就会得到堆栈跟踪。

+0

不错的建议,但是,我已经使用数据库清理宝石。它设置为在':each'测试之间运行。当这个问题出现时,我也仔细考虑了这一点,但我仔细检查了配置,看起来没问题。以防万一,我会将我的数据库清理器配置添加到主要问题中。 –

+0

另一种较老的,扩展性较差的方法是在运行测试之前创建所有数据库设备,以便实际上不会实时创建对象。但是,这使得将测试数据维护在一个大型的代码库中相当困难。 – photoionized

+0

@WesFoster:编辑我的回应与实际的错误。之前没有打扰读取堆栈跟踪。编辑中的答案是真正的问题,而不是数据库清理。 – photoionized