Ruby on rails “测试”;“后期创建”;带Rspec

Ruby on rails “测试”;“后期创建”;带Rspec,ruby-on-rails,testing,rspec,factory-bot,rspec-rails,Ruby On Rails,Testing,Rspec,Factory Bot,Rspec Rails,我正在尝试用Rspec测试“创建后”操作。代码如下: def valid_attributes { :zone => Flymgr::Zone.new(:countries => Flymgr::ZoneCountry.first, :name => 'USA', :description => 'USA Flight', :zipcodes => ''), :price => '

我正在尝试用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创建一个区域和规则条目?

您的请求参数哈希有一个对象作为值:zone,当您发布它时,它将只是“to_'-ed”,这不可能是您想要的

通常,最佳做法是使用factory girl构建对象,并使用attributes_for strategy为post请求参数化其属性:

您的问题是,该关联是一个归属,因此您只需要发布一个id。请注意,目前FactoryGirl没有为该关联创建任何属性。如果规则的工厂定义考虑了区域关联,则可以使用以下解决方法:

FactoryGirl.build(:flymgr_rule).attributes
要同时包含区域id,则需要排除不需要的参数。 (“id”、“创建时间”、“更新时间”等)

因此,您最好按照在有效post请求中看到的方式显式插入区域的params散列信息

阅读以下有关factorygirl属性和关联的帖子:

正如作者所指出的:

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