2013-10-27 54 views
0

我有這樣的代碼:語法錯誤,意想不到的 ':',預計 ')'(的SyntaxError)

19 context 'overriding at fabricate time' do 
20  let(:fabricated_object) do 
21  Fabricate(
22   "#{fabricator_name}_with_children", do 
23   string_field: 'new content', 
24   number_field: 10, 
25   nil_field: nil, 
26   placeholder: 'is not invoked', 
27   dynamic_field: { 'new dynamic content' } 
28  end) 
29  end 

製造商:

1 class Fabrication::Fabricator 
    2 
    3 def self.build(name, overrides={}, &block) 
    4  fail_if_initializing(name) 
    5  schematic(name).build(overrides, &block) 
    6 end 
    7 
    8 def self.fabricate(name, overrides={}, &block) 
    9  fail_if_initializing(name) 
10  schematic(name).fabricate(overrides, &block) 
11 end 
12 
13 def self.to_attributes(name, overrides={}, &block) 
14  fail_if_initializing(name) 
15  schematic(name).to_attributes(overrides, &block) 
16 end 
17 
18 def self.to_params(name, overrides={}, &block) 
19  fail_if_initializing(name) 
20  schematic(name).to_params(overrides, &block) 
21 end 
22 
23 private 
24 
25 def self.fail_if_initializing(name) 
26  raise Fabrication::MisplacedFabricateError.new(name) if Fabrication.manager.initializing? 
27 end 
28 
29 def self.schematic(name) 
30  Fabrication::Support.find_definitions if Fabrication.manager.empty? 
31  Fabrication.manager[name] || raise(Fabrication::UnknownFabricatorError.new(name)) 
32 end 
33 
34 end 

,但我不斷收到

integration_spec.rb:23: syntax error, unexpected ':', expecting ')' (SyntaxError) 
     string_field: 'new content', 
        ^
/home/durrantm/Dropbox/96_2013/work/code/ruby/fabrication_temp/spec/_seded/integration_spec.rb:23: syntax error, unexpected ',', expecting kEND 
/home/durrantm/Dropbox/96_2013/work/code/ruby/fabrication_temp/spec/_seded/integration_spec.rb:25: Can't assign to nil 
/home/durrantm/Dropbox/96_2013/work/code/ruby/fabrication_temp/spec/_seded/integration_spec.rb:26: syntax error, unexpected ':', expecting '=' 
     placeholder: 'is not invoked' 
        ^
/home/durrantm/Dropbox/96_2013/work/code/ruby/fabrication_temp/spec/_seded/integration_spec.rb:27: syntax error, unexpected ')', expecting kEND 
... 

我怎樣才能解決這個問題? 我試過用很多方法格式化哈希,但都沒有工作。

代碼使用這種格式的工作(我想移動到期望的那樣):

context 'overriding at fabricate time' do 
    let(:fabricated_object) do 
     Fabricate(
     "#{fabricator_name}_with_children", 
     string_field: 'new content', 
     number_field: 10, 
     nil_field: nil, 
     placeholder: 'is not invoked' 
    ) do 
     dynamic_field { 'new dynamic content' } 
     end 
    end 

我也試過:

19 context 'overriding at fabricate time' do 
20  let(:fabricated_object) do 
21  Fabricate(
22   "#{fabricator_name}_with_children", 
23   { string_field: "new content", 
24   number_field: 10, 
25   nil_field: nil, 
26   placeholder: 'is not invoked', 
27   dynamic_field: { 'new dynamic content' }}) 
28  
29  end 

,但得到

integration_spec.rb:23: odd number list for Hash (SyntaxError) 
    { string_field: "new content", 
+5

爲了完整起見,你可以包含所有匹配的'end'嗎?因爲沒有它們本身就是一個SyntaxError。還有你使用的是什麼Ruby版本? –

+1

你使用的是哪個版本的ruby? – Yossi

+0

紅寶石1.9.3-p194或紅寶石1.9.3-p448(紅寶石2.0有其他問題)。業。不是1.8 :) –

回答

1

嘗試安排致電Fabricate(...)如下:

Fabricate("#{fabricator_name}_with_children".to_sym) do 
    string_field 'new content' 
    number_field 10 
    nil_field  nil 
    placeholder 'is not invoked' 
    dynamic_field { 'new dynamic content' } 
    end 

編輯:我已經做了一些本地控制檯實驗,以確保它應該工作。我假設這些值是製造商的默認值,例如,

2.0.0p195 :014 > Fabricator(:x) do 
2.0.0p195 :015 > string_field 'new content' 
2.0.0p195 :016?> number_field 10 
2.0.0p195 :017?> nil_field  nil 
2.0.0p195 :018?> placeholder 'is not invoked' 
2.0.0p195 :019?> dynamic_field { 'new dynamic content' } 
2.0.0p195 :020?> end 

我可以製造ok--

2.0.0p195 :032 > Fabricate(:x) 
=> #<X:0x98c32c4 @string_field="new content", @number_field=10, @nil_field=nil, @placeholder="is not invoked", @dynamic_field="new dynamic content"> 

一個實例我可以通過一個像塊above--

2.0.0p195 :055 > Fabricate(:x) do 
2.0.0p195 :056 > string_field 'alternate content' 
2.0.0p195 :057?> number_field 999 
2.0.0p195 :058?> nil_field  nil 
2.0.0p195 :059?> placeholder 'changed' 
2.0.0p195 :060?> dynamic_field { 'different dynamic content' } 
2.0.0p195 :061?> end 
=> #<X:0x948eff0 @string_field="alternate content", @number_field=999, @nil_field=nil, @placeholder="changed", @dynamic_field="different dynamic content"> 

或者使用混合模式使用參數/塊:

2.0.0p195 :062 > Fabricate(:x, string_field: 'new content', number_field: 37, nil_field: nil, placeholder: 'blah') do 
2.0.0p195 :063 >  dynamic_field { 'new dynamic content' } 
2.0.0p195 :064?> end 
=> #<X:0x92c4e54 @string_field="new content", @number_field=37, @nil_field=nil, @placeholder="blah", @dynamic_field="new dynamic content"> 

在這個階段,我想這個問題是一個未封閉的區塊。

+0

謝謝,不幸的是我得到'integration_spec.rb:24:語法錯誤,意外的tINTEGER,期待kDO或'{' 或 '('(的SyntaxError) number_field 10, ^ /home/durrantm/Dropbox/96_2013/work/code/ruby/fabrication_temp/spec/_seded/integration_spec.rb:26:語法錯誤, 意想不到tSTRING_BEG,期待kDO或'{'或'(' 佔位符'未被調用' ' –

+0

您的Fabricator類是什麼樣的? – struthersneil

+0

添加了該代碼。 –

1

不應該這樣:

21  Fabricate(
22   "#{fabricator_name}_with_children", do 
23   # ... 
28  end) 

更喜歡:

21  Fabricate(
22   "#{fabricator_name}_with_children") do 
23   # ... 
28  end 

如,與之前做右括號,而不是(錯誤地)包裝呢?

另一種可能的替代方案,在事件仍然吐出了一個錯誤,以確保運算符優先級正確應用:

21  Fabricate(
22   "#{fabricator_name}_with_children") { 
23   # ... 
28  } 

另一個選擇,看到那個東西看起來內容像散列而不是塊:

21  Fabricate(
22   "#{fabricator_name}_with_children", { 
23   # ... 
28  }) 
+0

我試着第一個建議,並得到:integration_spec.rb:23:語法錯誤,意外的':',期待kEND(SyntaxError) string_field:「new content」, –

+0

我試了第二次,得到了integration_spec.rb:23:奇數號列表哈希(SyntaxError) {string_field:「new content」, –

+0

那麼你可能正處在正確的軌道上。用緊密的{}語法替換所有嵌套的do塊結束塊並查看結果。 (Imho,錯誤可能發生在您發佈的代碼之前。) –

相關問題