ruby 如何为一个有self.方法的类编写单元测试/迷你测试,而这个方法中几乎没有硬编码的类(我是在ror中编写测试的新手)?

wrrgggsh  于 2023-06-22  发布在  Ruby
关注(0)|答案(1)|浏览(118)

我给了一个任务,在2017年写的这个特定的类中编写单元测试,但是因为我是新来的,代码结构太糟糕了,我无法找到最好的方法来编写单元测试,任何人都可以帮助这个或提供一些见解。
我也被告知不要为它改变太多的商业逻辑。

module Alpha
  module Beta
    module Gamma
      class User
        class SsoUser
          def self.find(type, organization, user_identifier)
            if user_identifier.blank?
              raise Error.new(
                'user_identifier must be provided',
                400,
                'missing.required.attribute'
              )
            end

            case type.try(:downcase)
            when 'admin'
              AdminUser.new().find_admin(organization, user_identifier)
            when 'subscriber'
              SubscriberUser.find(organization, user_identifier)
            when 'master_admin'
              AdminUser.new().find_master_admin(organization,user_identifier)
            else
              raise Error.new(
                "'type' parameter must be one of [admin,subscriber,master_admin]",
                400,
                'missing.required.attribute'
              )
            end
          end
        end
      end
    end
  end
end

现在,我需要编写测试的类名是SsoUser,这里使用的其他类是Error,AdminUser(基于类型-'admin'或类型-'master_admin'返回用户对象),SubscriberUser(也基于类型-'subscriber'返回用户)。
user_identifier是'user_name',它是字符串,类型也是如上所述的字符串,组织将给出一个ID。
提前道歉,如果有什么不清楚的地方。
我在编写此类中self.method的测试时遇到问题。还有如何测试那些硬编码的类,这些类应该理想地用构造函数方法编写。我没有尝试太多,因为我还是新手。

j0pj023g

j0pj023g1#

我可以告诉你从哪里开始,并使用同样的原理继续你的测试

require "test_helper"

class Alpha::Beta::Gamma::User::SsoUserTest < ActiveSupport::TestCase

  test "arise with Error" do
   err = -> { Alpha::Beta::Gamma::User::SsoUser.find(nil, nil, nil)}.must_raise Error
   err.message.must_match /user_identifier must be provided/
  end

  test "find Admin" do
   assert_instance_of AdminUser, Alpha::Beta::Gamma::User::SsoUser.find('admin', organization(:first), user(:admin).user_identifier)
  end
end

organization(:first)和user(:admin)-这是您应该在测试文件夹(/test/fixtures/user.yml和/test/fixtures/organization.yml)中创建的fixture。在此page中,您可以找到其他Assert和工具,它们可以帮助您编写测试
我写了近似的代码,其中可能包含潜在的错误,但一般的想法看起来是这样的

相关问题