如何解决为RSpec
我希望添加一个Session
变量来跟踪每个RSpec测试的cookie和其他信息。我想从各种文件/类中访问Session
,但希望每个测试用例创建并更新一个Session
。
我最初的想法是创建一个Session
类,并在before(:each)
中对其进行初始化。这样,每个规范都可以访问Session
,但是规范调用的类无法访问它。
实现此目标的最佳方法是什么?
这是一些示例代码-
我的请求包装器:
# frozen_string_literal: true
require 'faraday'
require 'securerandom'
# A custom exception class used by the Faraday wrapper
class RequestBuilderException < StandardError
def initialize(msg = 'Exception during RequestBuilder',exception_type = 'requestbuilder')
@exception_type = exception_type
super(msg)
end
end
# A Faraday API requests wrapper class.
class RequestBuilder
attr_accessor :conn
def initialize(host)
@conn = Faraday::Connection.new host
end
def get(url: nil,expected_statuses: [200,202,204],**options)
request(http_method: 'get',url: url,expected_statuses: expected_statuses,params: options[:params],headers: options[:headers],cookies: options[:cookies],body: options[:body])
end
def post(url: nil,**options)
request(http_method: 'post',body: options[:body])
end
...
# rubocop:disable Metrics/CyclomaticComplexity
def request(http_method: nil,url: nil,expected_statuses: [],**options)
response = @conn.public_send(http_method) do |request|
request.url url
if options.key?(:headers) && options[:headers]
options[:headers].each do |name,value|
request.headers[name] = value
end
end
if options.key?(:params) && options[:params]
options[:params].each do |name,value|
request.params[name] = value
end
end
request.body = options[:body] if options[:body]
end
sanitize_response(response,expected_statuses)
end
def sanitize_response(response,exepected_statuses)
raise RequestBuilderException,'No response received.' unless response
unless exepected_statuses.include? response.status
raise RequestBuilderException.new "Received unexpected status code #{response.status},\
expected status in #{exepected_statuses}",'RequestBuilder.status'
end
response
end
end
然后我有两个利用Students
类的类Courses
和requests
require 'framework/util/request'
class StudentsApi
attr_accessor :conn,:authorization_header,:user_info,:accounts_register_response
def initialize(host,authorization)
@conn = RequestBuilder.new(host)
@authorization_header = authorization.auth_string
@user_info = nil
@accounts_register_response = nil
end
def accounts_register(expected_statuses: [201],**options)
user_hash = {
first_name: options.fetch(:first_name,nil),last_name: options.fetch(:last_name,email: options.fetch(:email,password: options.fetch(:password,remember_me: options.fetch(:remember_me,zip_code: options.fetch(:zip_code,source: options.fetch(:source,nil)
}
headers = { 'Authorization': authorization_header,'X-Requested-With': 'XMLHttpRequest','Accept': 'application/json' }
params = { 'user': user_hash}
@accounts_register_response = conn.post(url: '/accounts/register',headers: headers,params: params,expected_statuses: expected_statuses)
@user_info = User.from_response(@accounts_register_response)
@user_info
end
def accounts_login(email:,password:,accept: 'application/json',**_options)
headers = { 'Authorization': authorization_header,'Accept': accept }
params = { 'email': email,'password': password }
conn.post(url: '/accounts/login',params: params)
end
end
class CoursesApi
attr_accessor :conn,authorization)
@conn = RequestBuilder.new(host)
@authorization_header = authorization.auth_string
@user_info = nil
end
def egister_course(email:,'Accept': accept }
params = { 'email': email}
conn.post(url: '/register_course',params: params)
end
end
最后,我有一个rspec测试可以测试新注册的Student可以注册一门课程(这需要电子邮件+ cookie,该cookie作为Set-Cookie
的形式发送到Student.accounts_login的响应上>
require 'framework/students/api'
require 'framework/courses/api'
RSpec.describe 'Creating New Student' do
before(:all) do
@new_student = StudentsApi.new_user(@user_session)
end
it 'allows students to register and login' do
expect(@new_student.accounts_register_response.status).to eq(201)
expect(@new_student.accounts_login.status).to eq(200)
end
it 'allows students to sign up for a course' do
expect(@new_student.accounts_register_response.status).to eq(201)
expect(@new_student.accounts_login.status).to eq(200) # need to store cookies from this response
course = CoursesApi.new(name: 'Math')
expect(course.register_course(email: @new_student.email)).to eq(201) # requires the cookies to be sent
end
end
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。