我开始重构我的测试以在不加载Rails的情况下运行。我的大多数测试仍然是加载轨道的标准rspec测试。我的问题是,在下面的测试文件中,我覆盖了许多其他测试文件中使用的一个类。因此即使这些测试通过,其他测试也会失败。我希望在得到很多建议后here来存根那个Project类。 (我宁愿在这个文件中存根项目类,而不是在需要它的所有其他测试文件中重新加载项目类。)
这就是我现在所拥有的。
require 'active_model'
require 'active_model/validations'
require 'active_record/callbacks'
require 'active_support/core_ext/string' #used for '.blank?' method
class Project
attr_accessor :general_media
def initialize(attributes = {})
@general_media = attributes[:general_media]
end
include ActiveModel::Validations
include ActiveRecord::Callbacks
end
require_relative '../../../app/models/project/media.rb'
describe 'Project::Media' do
#then all the tests
我试图创建一个FakeProject类,并让Project :: Media通过使用FakeProject对Project进行存根来继承它,但是它没有用。这就是我所拥有的。
require 'active_model'
require 'active_model/validations'
require 'active_record/callbacks'
require 'active_support/core_ext/string' #used for '.blank?' method
class FakeProject
attr_accessor :general_media
def initialize(attributes = {})
@general_media = attributes[:general_media]
end
include ActiveModel::Validations
include ActiveRecord::Callbacks
end
class Project; end
require_relative '../../../app/models/project/media.rb'
describe 'Project::Media' do
before(:all) { stub_constant!("Project", FakeProject) }
首先,我仍在覆盖项目类,其次,stubbig不起作用。我仍然收到有关验证无效的错误。
undefined method `validate' for Project::Media:Class (NoMethodError)
有什么建议吗?我的目标是仅为此media_spec.rb测试文件中的测试存根Project类,而不是覆盖Project类对所有测试的行为。
答案 0 :(得分:13)
您可以使用rspec语法创建Fake类。类似的东西:
let(:fake_class) { Class.new }
stub_const("Project", fake_class)
如果你想为该Project类存根任何方法,你可以这样做:
dummy_class = Project # the same name that you used above
# stub any method and return anything that you want to return
dummy_class.stub_chain(:any_method).and_return(anything)