如果在类主体中调用过方法,如何在Ruby / Rails中进行测试?

时间:2018-10-18 22:18:51

标签: ruby-on-rails ruby rspec

我不知道如何从类主体中测试类方法调用。

我该如何测试?

class User
  act_as_paranoid
end


it 'is called from class body' do
  expect(User).to receive(:acts_as_paranoid)
  User.new
end

3 个答案:

答案 0 :(得分:5)

通常建议测试行为,而不是实现。在这种情况下,您要测试的是acts_as_paranoid 为此行为提供的

但是,如果您相信调用acts_as_paranoid可以正确提供所需的所有行为,并且只想测试是否已将其添加到类中,则可以使用:

assert User.included_modules.include? ActsAsParanoid::Core

要弄清楚这一点,我在这里简要地查看了act_as_paranoid的源代码:https://github.com/ActsAsParanoid/acts_as_paranoid/blob/master/lib/acts_as_paranoid.rb#L8

您可以看到在第50行,它将ActsAsParanoid模块扩展到ActiveRecord :: Base,它使模型类可以访问acts_as_paranoid方法。而且,如果您查看此方法的定义,您会看到它调用include ActsAsParanoid::Core

答案 1 :(得分:1)

已更新

这不是执行此操作的最佳方法,但是如果您必须这样做,则它更接近于您想要的:

describe 'Check if a string method is in a file' do
  it 'matches a string pattern' do
    lines = File.read('user.rb').split("\n")
    assert lines[1][/\b+acts_as_paranoid/]
    #hacky way to make sure you don't accidentally comment it out
    assert lines[1].split('#').count == 1 
  end
end

原始答案:

这里没有要测试的东西。除非在加载user.rb文件时定义了您的方法,否则您的类定义无效。那就是核心红宝石。证明。

#user_spec.rb
require 'minitest/autorun'
require_relative 'user'

describe 'User' do
  it 'is a valid class' do
    assert User
  end
end

#user.rb
class User
  acts_as_paranoid
end

如果在Ruby加载user.rb之前未定义acts_as_paranoid,则在需要该文件时spec就会失败。如果这是所有代码,则此测试将失败。注释掉acts_as_paranoid测试将通过。

答案 2 :(得分:0)

要测试是否已将acts_as_paranoid添加到User,可以执行以下操作:

it 'has acts_as_paranoid' do expect(User).to respond_to(:acts_as_paranoid) end