如何更新Rails RSpec nasted let属性

时间:2019-05-23 14:38:17

标签: ruby-on-rails rspec

我想更改先前定义的let中的属性以使测试有效。我知道它是哈希中的哈希,但是我的解决方案都不起作用。

我有几个类似的let,但看起来像这样

let(:second_data) do
  {
    'id' => second.id.to_s,
    'type' => 'account',
    'attributes' =>
     {
       'status' => 'new',
       'created_at' => second.created_at.as_json,
       'time_information' => second.credit.process.date_of_interest.as_json
     }
   }
end

最后,这些租赁被合并为一个

let(:json_serialized_offers) do
  {
    'data' => [first_data, second_data, third_data],
    'included' => first_included + second_included + third_included
  }
end

现在,我想将expired中的状态更改为second_data,该状态嵌套在data的{​​{1}}部分中(如上所示)。

我正试图在适当的情况下再次通过

:json_serialized_offers

但是什么都没有改变,有可能这样做吗?

1 个答案:

答案 0 :(得分:2)

只需使用另一个“ let”来设置状态属性即可。

使用新的let创建一个:status变量,并像这样更改您的第一个let

let(:status) { 'new' } # <==== new let

let(:second_data) do
  {
    'id' => second.id.to_s,
    'type' => 'account',
    'attributes' =>
     {
       'status' => status # <==== set status using new variable
       'created_at' => second.created_at.as_json,
       'time_information' => second.credit.process.date_of_interest.as_json
     }
   }
end

然后,在需要更改它的上下文中,只需重新定义:status。

context "when status 'closed' passed " do
  let(:status) { 'expired' }
  it ...
end

这将在此上下文中重新定义:status,还将更改:second_data中的status属性。

此策略非常适合设置深层嵌套的属性,它还使您只需重新定义发生变化的事物即可。