我将测试模型关注的get_uniq_id方法。

app / models / concerns / id_generation.rb

module IdGeneration
  extend ActiveSupport::Concern

  module ClassMethods
    def get_uniq_id
      id = ''
      loop {
        id = generate_id
        break unless Ticket.find_by_token(id)
      }
      id
    end

    def generate_id
      id = []
      "%s-%d-%s-%d-%s".split('-').each{|v| id << (v.eql?('%s') ? generate_characters : generate_digits)}
      id.join('-')
    end

    def generate_digits(quantity = 3)
      (0..9).to_a.shuffle[0, quantity].join
    end

    def generate_characters(quantity = 3)
      ('A'..'Z').to_a.shuffle[0, quantity].join
    end    
  end
end

spec / concerns / id_generation_spec.rb

require 'spec_helper'
describe IdGeneration do
  class Dummy
    include IdGeneration::ClassMethods
  end
  subject { Dummy.new }
  it { should get_uniq_id.match(/[A-Z]{2}-[0-9]{2}-[A-Z]{2}-[0-9]{2}-[A-Z]{2}/) }
end

它引发错误:

 Failure/Error: it { should get_uniq_id.match(/[A-Z]{2}-[0-9]{2}-[A-Z]{2}-[0-9]{2}-[A-Z]{2}/) }
 NameError:
   undefined local variable or method `get_uniq_id' for #<RSpec::ExampleGroups::IdGeneration:0x00000001808c38>

如果我明确指定主题it { should subject.get_uniq_id.match(/[AZ]{2}-[0-9]{2}-[AZ]{2}-[0-9]{2}-[AZ]{2}/) }。 有用。

我是否需要明确指定主题?

#1楼 票数:0 已采纳

您调用方法的方式-是的。 该方法需要在对象上调用。 在这种情况下,将在当前正在运行的测试的上下文中执行get_uniq_id ,这就是为什么会弹出错误的原因。

您可以使用的快捷方式可能是:

it { should respond_to :get_uniq_id }

哪个将执行类似于subject.respond_to?(:get_uniq_id) 但是,该方法调用需要显式的接收者。

您可以对测试进行更新,以便像示例中那样使用它,如果您对其进行了稍微的修改:

require 'spec_helper'
describe IdGeneration do
  class Dummy
    include IdGeneration::ClassMethods
  end
  subject { Dummy.new }

  def get_uniq_id
    subject.get_uniq_id
  end

  it { should get_uniq_id.match(/[A-Z]{2}-[0-9]{2}-[A-Z]{2}-[0-9]{2}-[A-Z]{2}/) }
end

或者,将输出绑定到subject

require 'spec_helper'
describe IdGeneration do
  class Dummy
    include IdGeneration::ClassMethods
  end

  let(:dummy) { Dummy.new }
  subject     { dummy }

  describe "#get_uniq_id" do
    subject { dummy.get_uniq_id }

    it { should match(/[A-Z]{2}-[0-9]{2}-[A-Z]{2}-[0-9]{2}-[A-Z]{2}/) }
  end
end

  ask by Lesha Pipiev translate from so

未解决问题?本站智能推荐:

1回复

Rspec存根不起作用

我有以下规格来测试控制器方法: 和控制器本身: 相当简单的代码,但不知何故stub! 方法只是没有真正的存根,所以第二个规范失败了, expecting <"new"> but rendering with <""> 。 它只是重定向,如果valid? 返回
1回复

使用Rspec测试我的操作时redirect_to不起作用

我正在测试一个动作,但无法通过。 我的规格: 我的代码: 我收到的消息是:
1回复

设计登录在rspec测试中不起作用

就像标题中解释的那样。 这是我的rails助手: 这是我的能力测验: 因此,当我运行此测试时,Firefox会打开并显示登录页面(但是我确实sign_in登录了)。 当我手动尝试通过槽binding.pry登录并访问root_path时,我得到: 我的member_fabric
1回复

Railsalias_attribute在RSPEC中不起作用

店内型号: 在商店工厂: 在RSPEC Shops Controller中: Rails控制台测试: 评论alias_attribute :token, :basic_token ,它可以工作。 知道为什么我不能使用alias_attribute进行记录吗? 请注意,这在
2回复

rspec中的subject.invoke是什么?

根据rails 4.2.4和rspec 3.4升级,我正在修复大型应用程序中的规范。 以前的开发人员使用subject.invoke ,但现在似乎不起作用。 什么是subject.invoke ?如何替代它?
2回复

Rspec+Spring不起作用

我最近开始在Rails中进行开发。 我在使用Spring时遇到问题。 我将Spring与Rspec结合使用以加快测试速度。 尽管测试运行良好,但似乎并不能像通常那样给我带来巨大的速度改进。 我怀疑它无法正常工作。 我正在使用ruby 2.2.0和Rails 4.2 我在安装过程
1回复

用rspec和factorygirl进行测试不起作用

我正在关注Rails API的本教程 ,但是它有点过时了,有些事情似乎不适用于更新版本的Rails。 我在用户控制器规格方面遇到了困难: user_controller_spec.rb user_controller.rb user.rb工厂 但是,这不起作用,电子邮件似乎不匹
1回复

RSpec请求测试-登录不起作用

我正在尝试完成RSpec请求规范,但是遇到了问题。 有人可以向我解释为什么该测试可以按预期进行: 但是此测试失败,并出现以下错误:失败/错误:删除“ / registered_applications / 1” NoMethodError:RegisteredApplication的未定