Ruby on rails 如何调整测试助手以说明测试用户来自哪个模型(元编程)
我随后开发了一个日志作为测试助手。现在我想通过添加类型作为参数来进行一些元编程。类型指定用户来自哪个模型。有两个模型(成员和组织),每个模型都可以使用相同的页面/创建方法(通过if-else语句)登录 但是,对于集成测试,该测试不起作用。测试始终将用户视为来自模型组织,而不是来自成员。我做错了什么 我有以下测试助手:Ruby on rails 如何调整测试助手以说明测试用户来自哪个模型(元编程),ruby-on-rails,ruby,ruby-on-rails-4,Ruby On Rails,Ruby,Ruby On Rails 4,我随后开发了一个日志作为测试助手。现在我想通过添加类型作为参数来进行一些元编程。类型指定用户来自哪个模型。有两个模型(成员和组织),每个模型都可以使用相同的页面/创建方法(通过if-else语句)登录 但是,对于集成测试,该测试不起作用。测试始终将用户视为来自模型组织,而不是来自成员。我做错了什么 我有以下测试助手: def log_in_as(type, user, options = {}) password = options[:password] || 'pass
def log_in_as(type, user, options = {})
password = options[:password] || 'password'
remember_me = options[:remember_me] || '1'
### Additional if-else statement needed for type? ###
if integration_test?
post login_path, session: { email: user.email,
password: password,
remember_me: remember_me }
else
if type == "mem_ber"
session[:member_id] = user.id
elsif type == "org_anization"
session[:organization_id] = user.id
end
end
end
def is_logged_in_member?
!session[:member_id].nil?
end
def is_logged_in_organization?
!session[:organization_id].nil?
end
private
# Returns true inside an integration test.
def integration_test?
defined?(post_via_redirect)
end
集成测试:
require 'test_helper'
class SiteLayoutTest < ActionDispatch::IntegrationTest
def setup
@admin = members(:michael)
@non_admin = members(:archer)
@org_admin = organizations(:one)
@org_nonadmin = organizations(:two)
end
test "ff" do
log_in_as("mem_ber", @admin)
puts "member: #{is_logged_in_member?}"
puts "organization: #{is_logged_in_organization?}"
delete logout_path
log_in_as("mem_ber", @non_admin)
puts "member: #{is_logged_in_member?}"
puts "organization: #{is_logged_in_organization?}"
delete logout_path
log_in_as("org_anization", @org_admin)
puts "member: #{is_logged_in_member?}"
puts "organization: #{is_logged_in_organization?}"
delete logout_path
log_in_as("org_anization", @org_nonadmin)
puts "member: #{is_logged_in_member?}"
puts "organization: #{is_logged_in_organization?}"
delete logout_path
end
end
对于测试文件中的所有四个loggin\u as
测试,它会显示is\u loggin\u member?
false和is\u logging\u in\u organization?
true,如果它实际上是来自members.yml的夹具,也会显示为true。我还尝试添加
self.set_fixture_class organizations: Organization
self.set_fixture_class members: Member
给测试助手,但这没有什么区别
如果我从测试中删除组织(在
def setup
中,以及删除四个测试中的两个),它仍然会产生相同的结果,因为它将成员用户视为组织。只有当我同时清空organizations fixtures文件时,它才会将成员视为成员。在test\u helper.rb
中:
self.set_fixture_class usertype1: Usertype1
self.set_fixture_class usertype2: Usertype2
我找到了原因:原来在两个fixture文件中都有一个具有相同电子邮件地址的实例。您说这两种类型都是从相同的页面/创建方法登录的,那么该表单如何确定用户的类型呢?如果它只是一个参数,您可以将其添加到传递给
post login\u path
的会话参数中。如果它是在后端确定的,那么我认为它将按原样工作。我已经添加了会话控制器。不确定如何将参数传递到post login\u path
…听起来问题不在于log\u as
方法,而在于Usertype2.find\u by(email:params[:session][:email].downcase)
正在从Usertype1
夹具返回用户。Usertype2
装置是否与Usertype1
装置分开,或者您是否将该类型指定为更通用的User
的属性?是的,我有一个Usertype1.yml和一个Usertype2.yml。在开发服务器上,它工作正常:然后usertype1被视为这样,usertype2也同样如此。只有通过测试才有问题。因此,我认为这意味着问题不在def create
…似乎问题在fixture和create
方法之间的通信中(因为当调用Usertype2
上的find
时,create返回了Usertype1
的实例)。值得检查的一件简单的事情是,如果将夹具文件的名称更改为复数,行为是否会改变。如果没有,我会尝试显式地设置每个fixture引用的类(请参阅“当模型名和表名不匹配时”)尝试它,但不幸的是结果相同。
self.set_fixture_class usertype1: Usertype1
self.set_fixture_class usertype2: Usertype2