相关FixtureSet中Rails测试夹具的访问属性

时间:2016-02-10 21:02:04

标签: ruby-on-rails ruby-on-rails-4 yaml fixtures

背景

我的应用程序定义了Employee和Company模型之间的一对多关系。我使用公司夹具(37_signals)的标签为Employee夹具分配了公司。但是,我还需要分配由company_uuid生成的SecureRandom.uuid


实施例

应用程序/模型/

employee.rb

class Employee
  belongs_to :company
end

company.rb

class Company
  has_many :employees
end


测试/装置/

employees.yml

employee:
  name: dhh
  company: 37_signals 
  company_uuid: <%= "Access the 37_signals company fixture's uuid here!" %>

companies.yml

37_signals:
  name: $LABEL
  company_uuid: <%= SecureRandom.uuid %>


问题

如何在另一个FixtureSet中访问Fixture的属性?


尝试

我尝试使用以下行作为解决方案:

company_uuid: <%= ActiveRecord::FixtureSet.identify(:37_signals).company_uuid %>

以上查找公司的主键id值,然后调用company_uuid方法,该方法未定义整数。这是无效的。

company_uuid: <%= companies(:37_signals).company_uuid %>

以上查找报告undefined method 'companies' for main:Object

有解决此问题的传统方法吗?

3 个答案:

答案 0 :(得分:2)

这是我能够设计的最佳解决方案:

mNotificationManager = (NotificationManager)
        this.getSystemService(Context.NOTIFICATION_SERVICE);
Intent resultIntent = new Intent(this, AcceptRejectActivity.class);
resultIntent.putExtra("message","Do you choose to accept this message?");      

PendingIntent contentIntent = PendingIntent.getActivity(this, 0, resultIntent, PendingIntent.FLAG_UPDATE_CURRENT);

String msg = "You have a message"
NotificationCompat.Builder mBuilder =
        new NotificationCompat.Builder(this)
                .setSmallIcon(R.drawable.ic_logo)
                .setContentTitle("Message")
                .setStyle(new NotificationCompat.BigTextStyle()
                        .bigText(msg))
                .setContentText(msg)
                .setPriority(Notification.PRIORITY_HIGH);
mBuilder.setContentIntent(contentIntent);
mBuilder.setAutoCancel(true);

android.app.Notification note = mBuilder.build();
note.defaults |= android.app.Notification.DEFAULT_VIBRATE;
note.defaults |= android.app.Notification.DEFAULT_SOUND;        

mNotificationManager.notify(0, note);

但是,此解决方案似乎不是传统此外,我相信这会成功运气,因为灯具按字母顺序加载。如果company_uuid: <%= Company.find(ActiveRecord::FixtureSet.identify(:publish_and_export_album)).company_uuid %> 被命名为Company,请在Organization之后加载,那么我认为这不会按预期工作。实际上,通过反复试验,我确定此方法适用于相反的方向,所以alpha阶没有任何不利影响。

答案 1 :(得分:2)

嗯,第一个选项应该是干掉数据,所以它只存在于一个地方。您可以使用delegate执行此操作,以便employee.company_uuid始终回答employee.company.company_uuid

如果你真的需要在Employee模型中,下一个最好的选择是使用回调(如before_validateafter_save,具体取决于你的用例),从而复制公司到Employee对象。您希望消除数据值与其真正来源不同的机会。

最后,您可以将所有UUID提取到创建时两个灯具都可访问的哈希值,并设置两个值,如: company_uuid: <%= UUIDs['37_signals'] %> ......或类似的

答案 2 :(得分:0)

如果您使用the fixture_builder gem,这不是问题。它允许您构建模型对象的图形并为它们提供夹具名称,并将它们保存到.yml夹具文件中。