如何更新rails rspec nasted let 属性

mr_*_*cle 3 rspec ruby-on-rails

我想更改先前定义的属性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
Run Code Online (Sandbox Code Playgroud)

最后这些let被合并为一个

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

现在我想将状态更改为expiredin second_datawhich is 嵌套在datain部分:json_serialized_offers(如上所示)。

我试图在正确的背景下再次澄清它,通过

context "when status 'closed' passed " do
            let(:json_serialized_offers) do
              {
                'data' => second_data { status: 'expire' }
              }
            end
            # some logic
          end
Run Code Online (Sandbox Code Playgroud)

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

Gly*_*oko 7

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

创建一个新的 :status 变量let并更改您的第一个变量,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
Run Code Online (Sandbox Code Playgroud)

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

context "when status 'closed' passed " do
  let(:status) { 'expired' }
  it ...
end
Run Code Online (Sandbox Code Playgroud)

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

此策略非常适合设置深度嵌套的属性,并且还使您只需重新定义已更改的内容即可。