'sharing' 函数的请求规范应该是什么样子的?

How request spec for 'sharing' function should look like?

我在为 Controller 中的函数编写请求规范时遇到了一些问题。该功能应该让用户与另一个用户共享购物清单。我正在使用 FactoryBot。

 class ShoppingListsController < ApplicationController
  before_action :authenticate_user!


  def share
    shopping_list = current_user.shopping_lists.find(params[:id])
    user = User.find_by(email: params[:email])
    user_list = UserShoppingList.new(user: user, shopping_list: shopping_list)
    if user_list.save
      flash[:notice] = "Shopping list has been shared"
    else
      flash[:alert] = "Shopping list has not been shared"
    end
    redirect_to shopping_lists_path
  end
end

股票规格应该是什么样的?我卡在这个阶段了,不知道怎么才能通过这里 shopping_list_id 以及 'expect' 应该是什么样子

require "rails_helper"

RSpec.describe ShoppingListsController, type: :request do
  login_user
  let (:user) { controller.current_user }
  let (:shopping_list) { create :shopping_list, user: user }

describe 'share shopping list' do
    it 'let current user share shopping list' do
      post share_shopping_list_path, params: {email: 'user2@gmail.com'}  

  end

任何帮助将不胜感激:)

我喜欢做的是查看操作并挑选出我想要确保发生的事情,所以采用您的代码片段我最终会得到:

- valid shopping list
  - shopping list is created for the target user
  - shows a success message
  - redirects to shopping list index path
- invalid shopping list
  - shows a warning message
  - redirects to shopping list index path

然后我们可以通过将每个顶级点作为上下文并将每个点置于期望之下来将其转化为 RSpec:

describe 'share shopping list' do
  let(:params) { { email: 'user2@gmail.com' } }
  # pass route params like id into path helper here
  subject { post share_shopping_list_path, params: params }

  context 'valid shopping list' do
    before do
      # set up a valid shopping list
    end

    it 'shopping list is created for the target user' do
    end

    it 'shows a success message' do
    end

    it 'redirects to shopping list index path' do
    end
  end

  context 'invalid shopping list' do
    before do
      # setup an invalid shopping list
    end

    it 'shows a warning message' do
    end

    it 'redirects to shopping list index path'
    end
  end
end

填满您的期望后,您可以考虑扩大测试范围。也许在多种情况下您希望购物清单无效(添加更多上下文)或者您可能想检查购物清单是否使用与原始相同的项目创建(添加更多期望)。