我不知道如何从类主体中测试类方法调用。
我该如何测试?
class User
act_as_paranoid
end
it 'is called from class body' do
expect(User).to receive(:acts_as_paranoid)
User.new
end
答案 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