2012-05-11 48 views
6

我正在尝试使用Rspec测试“创建后”操作。代码如下:使用Rspec测试“创建后”

def valid_attributes 
    { 
    :zone => Flymgr::Zone.new(:countries => Flymgr::ZoneCountry.first, 
     :name => 'USA', 
     :description => 'USA Flight', 
     :zipcodes => ''), 
    :price => '100.00', 
    :class => 'first', 

    } 
    end 

    def valid_session 
    {} 
    end 

    before(:each) do 
     @request.env["devise.mapping"] = Devise.mappings[:admin] 
     admin = FactoryGirl.create(:admin) 
     sign_in admin       
     end 

describe "POST create" do 
    describe "with valid params" do 
     it "creates a new Flymgr::Rule" do 
     expect { 
      post :create, {:Flymgr_rule => valid_attributes} 
     }.to change(Flymgr::Rule, :count).by(1) 
     end 

一个用于形式所需的属性是一个“区域”,这是一个下拉框和下拉选项与不同形式创建的。我不知道如何使用Rspec创建表单条目。正如你所看到的,我试图从不同的控制器Flymgr::Zone.new调用一个方法。我不认为这是行得通的,它正在打破我的考验。

任何人都可以建议最好的方法来做到这一点?也许我应该使用FactoryGirl来创建区域和规则条目?

回答

5

你的请求参数散列有一个对象作为zone的值,当你发布它时只会'to_s'-ed,这不太可能是你想要的。

一般来说最好的做法是用工厂女孩建立自己的对象,并使用attributes_for策略,参数及其属性的职位要求: What is the proper way to test 'create' controller actions?

你的问题是在暗示该组织是一个belong_to所以你只需要发布一个ID。请注意,目前,FactoryGirl不会为这些关联创建任何属性。如果您的规则定义的工厂需要的区域关联的照顾,你可以使用此解决方法:

FactoryGirl.build(:flymgr_rule).attributes 

还包括zone_id但是,那么你就需要排除不需要的PARAMS。 (“id”,“created_at”,“updated_at”等)。

所以,你可能会更好的显式插入区域的params散列信息,就像你在有效的post请求中看到它一样。

阅读factorygirl属性和关联的主题: https://github.com/thoughtbot/factory_girl/issues/359

3

由于guide指出:

# Returns a hash of attributes that can be used to build a User instance 
attrs = FactoryGirl.attributes_for(:user)