Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/53.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rspec嵌套控制器创建方法不会将计数增加1_Ruby On Rails_Rspec_Nested_Associations_Nested Attributes - Fatal编程技术网

Ruby on rails Rspec嵌套控制器创建方法不会将计数增加1

Ruby on rails Rspec嵌套控制器创建方法不会将计数增加1,ruby-on-rails,rspec,nested,associations,nested-attributes,Ruby On Rails,Rspec,Nested,Associations,Nested Attributes,我正在测试一个发票模型(一个客户端有许多发票,一个发票属于一个客户端),并尝试检查create方法是否有效 这就是我想到的: before do @valid_invoice = FactoryGirl.create(:invoice) @valid_client = @valid_invoice.client end it "creates a new Invoice" do expect { post :create, { invoice: @valid_cli

我正在测试一个发票模型(一个客户端有许多发票,一个发票属于一个客户端),并尝试检查create方法是否有效

这就是我想到的:

before do
  @valid_invoice = FactoryGirl.create(:invoice)
  @valid_client = @valid_invoice.client
end

it "creates a new Invoice" do
    expect {
      post :create, { invoice: @valid_client.invoices.build(valid_attributes), client_id: @valid_client.to_param }
    }.to change(Invoice, :count).by(1)
  end
这是我的发票工厂:

FactoryGirl.define do
    factory :invoice do
        association :client
        gross_amount 3.14
        net_amount 3.14
        number "MyString"
        payment_on "2013-01-01"
        vat_rate 0.19
    end
end
这是控制器中的创建方法:

def create
@client = Client.find(params[:client_id])
@invoice = @client.invoices.build(params[:invoice])

respond_to do |format|
  if @invoice.save
    format.html { redirect_to([@invoice.client, @invoice], :notice => 'Invoice was successfully created.') }
    format.json { render :json => @invoice, :status => :created, :location => [@invoice.client, @invoice] }
  else
    format.html { render :action => "new" }
    format.json { render :json => @invoice.errors, :status => :unprocessable_entity }
  end
end
end
以下是有效属性,即成功创建发票所需的属性:

def valid_attributes
{
  gross_amount: 3.14,
  net_amount: 3.14,
  number: "MyString",
  payment_on: "2013-01-01",
  vat_rate: 0.19
}
end
这些都是有效的。也许客户id不见了


它只是告诉我,计数没有改变一-所以我不知道问题是什么。我做错了什么?

@gregates-你的答案是对的,为什么要删除它?:-)再贴一次,我会检查它作为最佳答案

这就是解决方案:

post :create, { invoice: valid_attributes, client_id: @valid_client.to_param }, valid_session
而不是

post :create, { invoice: @valid_client.invoices.build(valid_attributes), client_id: @valid_client.to_param }
在测试中


此外,我还必须更改有效_属性中的数字。调试每一次验证都向我表明,它与工厂中的相同,但必须是唯一的。这帮我解决了!谢谢大家的帮助

create
方法是如何工作的?我假设它希望它的参数是属性的散列,而不是已经初始化的
Invoice
对象?请参见问题编辑。我添加了create方法。是的,它需要一个:invoice params散列。看起来您的发票很可能出现验证错误,这不会将任何内容保存到数据库,也不会增加发票计数。我建议使用
create和/或
保存,如果由于任何原因无法保存发票,将引发实际异常。@JasonSwett我从上述工厂获取了这些值。在所有其他测试中,它们都有效,我使用该工厂测试有效属性。有效的_属性和工厂之间的唯一区别是,工厂中有一个客户端_id。这可能是原因吗?