Ruby on rails 如何调整测试助手以说明测试用户来自哪个模型(元编程)

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

我随后开发了一个日志作为测试助手。现在我想通过添加类型作为参数来进行一些元编程。类型指定用户来自哪个模型。有两个模型(成员和组织),每个模型都可以使用相同的页面/创建方法(通过if-else语句)登录

但是,对于集成测试,该测试不起作用。测试始终将用户视为来自模型组织,而不是来自成员。我做错了什么

我有以下测试助手

  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