0

我有以下 rspec 测试:

def valid_attributes
  { "product_id" => "1" }
end

describe "POST create" do
  describe "with valid params" do
    it "creates a new LineItem" do
      expect {
        post :create, {:line_item => valid_attributes}, valid_session #my valid_session is blank
      }.to change(LineItem, :count).by(1)
    end

失败并出现此错误:

1) LineItemsController POST create with valid params redirects to the created line_item
   Failure/Error: post :create, {:line_item => valid_attributes}, valid_session
   ActiveRecord::RecordNotFound:
     Couldn't find Product without an ID
     # ./app/controllers/line_items_controller.rb:44:in `create'
     # ./spec/controllers/line_items_controller_spec.rb:87:in `block (4 levels) in <top (required)>'

这是我的控制器的创建操作:

def create
  @cart = current_cart
  product = Product.find(params[:product_id])
  @line_item = @cart.line_items.build(:product => product)

  respond_to do |format|
    if @line_item.save
      format.html { redirect_to @line_item.cart, notice: 'Line item was successfully created.' }
      format.json { render json: @line_item.cart, status: :created, location: @line_item }
    else
      format.html { render action: "new" }
      format.json { render json: @line_item.errors, status: :unprocessable_entity }
    end
  end
end

如您所见,我的操作需要来自请求params对象的 product_id。 我应该如何将此 product_id 用于我的 rspec 测试?

我试过把这个before声明:

before(:each) do
    ApplicationController.any_instance.stub(:product).and_return(@product = mock('product'))
  end

. . . 但它什么也没改变。我在某处遗漏了一些 rspec 概念。

4

2 回答 2

0

试试这样:

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

希望能帮助到你。

于 2012-12-04T20:02:14.147 回答
0

我最终通过使用夹具解决了我的问题,而不是按照另一个答案中的建议尝试模拟解决方案。

这样做的原因是控制器执行查询以从数据库中获取信息:product = Product.find(params[:product_id])我发现基于夹具的解决方案比使用模拟解决我的问题更快,而且我无法弄清楚如何快速存根查询(固定装置还有助于对控制器进行另一项测试,因此无论如何它最终都会有所帮助。

以供参考:

我在测试顶部用这条线引用了我的夹具:fixtures :products

我将测试更改为:

describe "POST create" do
  describe "with valid params" do
    it "creates a new LineItem" do
      expect {
          post :create, :product_id => products(:one).id
       }.to change(LineItem, :count).by(1)
    end

这是我的夹具文件 products.yml:

one:
    name: FirstProduct
    price: 1.23

two:
    name: SecondProduct
    price: 4.56
于 2012-12-05T13:12:55.010 回答