25

我有以下型号:

class Company < ActiveRecord::Base
  has_and_belongs_to_many :regions

class Region < ActiveRecord::Base
  has_many :requests
  has_and_belongs_to_many :companies

class RequestForProposals < ActiveRecord::Base
  belongs_to :region

每当我收到新请求时,我都想向同一地区的活跃公司发送通知。

如何在我的设备中进行设置,以便我可以对寻找合适公司的逻辑进行单元测试?

我试过了

region_ids: 1, 2
regions: one, two

在 company.yml 中,但在为公司分配区域时都不起作用。

这是生成的 SQL 的要点:https ://gist.github.com/2713518

4

4 回答 4

40

为了

regions: one, two

companies.yml工作中,您需要让 rails 自动分配区域的 id。这是因为(为了避免必须在 company.yml 之前读取 region.yml)rails 会根据公司固定装置的名称计算它在连接表中的 id。如果您自己分配了 ID,它们将与计算的 ID 不匹配。

从您提供的 sql 看来,您正在将区域上的 id 设置为 1 和 2,即您的 regions.yml 有

one:
  id: 1
  name: MyString 

删除id:1,你应该没问题。您还需要更新引用区域的任何其他文件(例如 request_for_proposals.yml),替换

region_id: 1

region: one

Rails 会知道这意味着在您的灯具中设置region_id带有标签的区域的 id 。one

于 2012-05-16T21:27:09.520 回答
0

您的 region.yml 在 test/fixtures 目录中吗?company.yml 怎么样?对于给定的公司,您的代码“区域:一,二”应该可以工作。
当您运行测试时,Rails 会自动加载此目录中的固定装置。如果位置正确,请在运行测试时发布测试输出 - 生成的 sql。

于 2012-05-15T05:45:58.603 回答
0

如果您需要自己计算此类 id,除了接受的答案之外,例如,您有一些松散的引用或其他数据源,只需添加:

def fixh(key)
  ActiveRecord::FixtureSet.identify key
end

给你test_helper.rb,然后在夹具中使用这种方式:

security_context1:
  ext_id: <%= fixh :user1 %>
于 2014-02-17T22:52:36.760 回答
-1

我不确定这些天人们如何使用 YAML 固定装置。您是否尝试过FactoryGirl在测试时创建数据库对象实例?它的作用与固定装置几乎相同,但方式要复杂得多。

以下段落假设您使用rspec的是测试框架。

包含factory_girl-rails在您的自述文件中并相应地Gemfile更新后,创建以下文件:spec/spec_helper.rbfactory_girl

# spec/factories/company_factories.rb
FactoryGirl.define do
  factory :company do
    title { |n| "Test Company #{n}" }

    # whatever else fields

    after_create { |company| company.regions << FactoryGirl.create(:region) }
  end
end

# spec/factories/region_factories.rb
FactoryGirl.define do
  factory :region do
    # whatever fields here
  end
end

# spec/factories/request_factories.rb
FactoryGirl.define do
  factory :request do        
    # whatever fields here
  end
end

现在真正的问题是——你正在做的实际测试代码是什么?

于 2012-05-14T07:59:19.133 回答