2012-08-31 43 views
0

我的测试是这样的:我是否需要在此测试中创建每个对象?

def setup 
    @period_registration= FactoryGirl.create(:period_registration) 
    end 


test "should post save_period" do 
    sign_in(FactoryGirl.create(:user)) 
    assert_difference('PeriodRegistration.count') do 
     post :save_period, period_registration: FactoryGirl.attributes_for(:period_registration) 
    end 
    assert_not_nil assigns(:period_registration) 

    end 

但是当我运行它,我得到这个错误:

1) Error: 
test_should_post_save_period(PeriodRegistrationsControllerTest): 
NoMethodError: undefined method `event' for nil:NilClass 

这里是我的控制器:

def save_period 
    @period_registration = PeriodRegistration.new(params[:registration]) 
    @period_registration.save 
    flash[:success] = "Successfully Registered for Session." 
    redirect_to event_url(@period_registration.period.event) 
    end 

我的工厂是这样的:

factory :event do 
    name 'First Event' 
    street '123 street' 
    city 'Chicago' 
    state 'Iowa' 
    date Date.today 
    end 


    factory :period do 
    name 'First Period' 
    description 'This is a description' 
    start_time Time.now + 10.days 
    end_time Time.now + 10.days + 2.hours 
    event 
    product 
    end 

factory :period_registration do 
    user 
    period 
    end 

我是否需要创建句点对象和事件对象?如果是这样如何?我不认为这是问题,因为我相信在各个工厂中有“时期”,然后是“产品”,然后是“事件”会自动产生这些问题。

任何想法从哪里看?

回答

1

简短的回答 - 是的,你确实创建了对象。

长的答案:

  1. 在控制器:

    @period_registration.period.event 
    

    这行代码违反The Law Of Demeter。这不是很好的设计。这行代码应该如下所示:

    @period_registration.event 
    

    但是您必须在PeriodRegistration模型中创建新方法。方法的最简单的变体可以是:

    def event 
        period.event 
    end 
    
  2. 在控制器:你不检查PeriodRegistration模型保存与否。

  3. 据我所知PeriodRegistration模型有2个关联,当您使用FactoryGirl.attributes_for时,工厂不会创建关联的对象,它只是给你PeriodRegistration的一组属性。为了使这个测试通过,你应该创建这2个对象,因为你呼叫控制器。最好的做法是 - 测试应该只有一个断言。例如:

    def setup 
        @user = FactoryGirl.create(:user) 
        @period = FactoryGirl.create(:period) 
    end 
    
    test "should post save_period" do 
        sign_in(@user) 
        assert_difference('PeriodRegistration.count') do 
        post :save_period, period_registration: FactoryGirl.attributes_for(:period_registration, user: @user, period: @period) 
        end 
    end 
    
    test "should assings @period_registration" do 
        sign_in(@user) 
        post :save_period, period_registration: FactoryGirl.attributes_for(:period_registration, user: @user, period: @period) 
        assert_not_nil assigns(:period_registration) 
    end 
    
  4. 当测试控制器时,您可以使用模拟对象而不是真实模型。

+0

关于你的#1,这是行不通的。我在控制台中测试了它,并且需要执行'pr.period.event'来获取事件。 –

+0

你的#3帮助我解决了另一个问题,虽然我正在做! –

+0

@NoahClark关于#1。您必须在PeriodRegistration模型中创建新方法。我已经更新了我的答案。 –

相关问题