gpt4 book ai didi

ruby-on-rails - 在 Rspec 中定义类

转载 作者:数据小太阳 更新时间:2023-10-29 07:40:38 24 4
gpt4 key购买 nike

我想测试将一个模块包含到一个类中。我正在尝试在 RSpec 中定义一个新类:

describe Statusable do
let(:test_class) do
class ModelIncludingStatusable < ActiveRecord::Base
include Statusable
statuses published: "опубликовано", draft: "черновик"
end
end

describe '#statuses' do
it 'sets STATUSES for a model' do
test_class::STATUSES.should == ["опубликовано", "черновик"]
end
end
end

我得到一个错误:

TypeError:
[ActiveModel::Validations::InclusionValidator] is not a class/module

这可能是因为在 Statusable 中我有:

validates_inclusion_of  :status, :in => statuses,
:message => "{{value}} должен быть одним из: #{statuses.join ','}"

但是如果我把它注释掉,我会得到:

TypeError:
["опубликовано", "черновик"] is not a class/module

也许新类定义不是最好的选择,那我该怎么办?即使不是,我如何在 RSpec 中定义类?我该如何解决这个错误?

最佳答案

不要在测试中定义新常量否则会污染其他测试。相反,请使用 stub_const

此外,这是 Statusable 模块的单元测试。如果 ActiveRecord 模型不是必需的,最好不要使用它。

你也可以使用class_eval来避免实际打开这个类(不管是假的还是假的)

describe Statusable do
before do
stub_const 'Foo', Class.new
Foo.class_eval{ include Statusable }
Foo.class_eval{ statuses published: "foo", draft: "bar"}
end

context '#statuses' do
it 'sets STATUSES for a model' do
FOO::STATUSES.should == ["foo", "bar"]
end
end
end

虽然我复制了你的断言,但我建议不要将常量 say STATUS 插入到包含此模块的类/模块 (Foo) 中。相反,类方法会更好

expect(Foo.status).to eq(["foo", "bar"])

关于ruby-on-rails - 在 Rspec 中定义类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21279188/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com