加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-17 01:52:48 所属栏目:百科 来源:网络整理
导读:我想测试一个模块包含在一个类中.我正在尝试在RSpec中定义一个新类: describe Statusable do let(:test_class) do class ModelIncludingStatusable ActiveRecord::Base include Statusable statuses published: "опубликовано",draft: "чер
我想测试一个模块包含在一个类中.我正在尝试在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

虽然我复制了你的断言,但我建议不要在包含这个模块的类/模块(Foo)中插入一个常量的STATUS.相反,类方法会更好

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读