在RSPEC请求测试中使用会话,cookie或Current_something



我正在尝试使用我正在进行的新项目遵循新的铁轨测试约定。因此,我设置了单元测试,请求测试和功能测试。问题在于,在请求测试中,Capybara和会话信息不支持。

除了通过deaise设置Current_user方法之外,我的应用程序还具有另一个类似的方法,称为current_client。对于我的某些控制器,我需要检查current_user是否已登录。这与Dewise Authenticate_user一起使用!在__act上调用。但是对于某些控制器,我还需要检查是否首先选择了客户端(例如,如果要添加交易,则需要与当前的客户端正在使用的端口相关(。

因此,我添加了另一种之前的_action方法,该方法还选择了客户端是否也选择了。这在Capybara的功能测试中效果很好,我可以在其中模仿用户登录,用户选择一个客户进行处理。但是,在请求测试中,它不起作用。

i首先测试尝试访问端点而无需登录用户,并且响应未成功(如它应该(,并将其重定向到页面中的符号。但是随后,我需要使用登录的用户和选择客户端进行测试。设计助手提供了sign_in(用户(方法。但是,我无法让我的Current_user方法工作,而且似乎无法正确设置它。因此,这些测试失败并重定向到另一个页面,要求用户选择客户端。

我已经尝试了很多我看到的建议。就像试图使Current_client方法存根一样,尝试将会话信息提供给Get Call。我什至尝试检查设计源代码,以找出他们如何在RSPEC中模拟Current_user方法,但找不到魔术发生的位置。

这是代码

current_client方法看起来像

def current_client
  current_client ||= Client.find(session[:client_id]) if session[:client_id]
  rescue ActiveRecord::RecordNotFound
  current_client = nil
end

这是一旦用户选择客户端来处理

,这就是设置的方式。
def set_current_client(client)
  session[:client_id] = client.id
end

这是我的测试文件中的代码我首先创建2个用户,以便我可以测试用户1无法访问用户2个交易。(我正在使用FactoryBot(然后,我创建2个客户端(每个用户一个(

RSpec.describe "Rooms", :type => :request do 
  let!(:user) {create(:user)}
  let!(:user2) {create(:user2)}
  let!(:client) {create(:client, user: user)}
  let!(:client) {create(:client, user: user2)}

以下工作

describe 'User Not Signed In' do 
  describe 'GET #index' do
    subject { get transact_path} 
    it "returns an unsuccessful response" do 
      subject
      expect(response).to_not be_successful
  end
  it "redirects to sign in page" do 
    subject
    expect(response).to redirect_to (new_user_session_path)
  end
end

以下内容没有。sign_in(用户(方法在以前的块中工作,并且重定向并未在页面中的符号中进行。但是,响应没有成功,因为没有设置Current_client,并且我试图在没有成功的情况下以多种方式设置它。

describe 'User Signed In' do 
  before do 
    sign_in(user)
  end
describe 'GET #index' do 
  it "returns a successful response" do 
    get transact_path
      expect(response).to be_successful
    end
  end
end

我知道,最佳实践脱离了控制器测试,因为呈现的视图或分配的实例变量与理论上的控制器无关。但是就我而言,我只是在尝试测试我的终点,现在我无法设置我的current_client。

我通过使用DHH自己的建议解决方案找到了一种方法。

而不是试图使current_client变量存根,或者尝试在ActionDisPatch :: Cookie的直觉中进行陪审团,而是只需要发表帖子或接听任何控制器来设置我的Current_client变量。

因此,对我而言,解决方案是将以下代码放在do block之前

before do
  sign_in(user)
  get select_client_path, params: {id: client.id}
end

最新更新