2017-06-27 61 views
1

考慮在寶石用下面的代碼,我們的主要應用程序的依賴性:如何嘲笑從輔助的方法在RSpec的

module Module1 
    module Module2 
    module EnvInit 
     def stub_env(name, value) 
     stub_const('ENV', ENV.to_hash.merge(name => value)) 
     end 
    end 
    end 
end 

RSpec.configure do |config| 
    config.include Module1::Module2::EnvInit 
    config.before(:each) do 
    stub_env('NAME', 'John Doe') 
    end 
end 

我們主要的應用程序使用.ENV文件爲我們的環境變量。但是,出於某種原因,上面的代碼會覆蓋ENV['NAME']。我們沒有獲得這種寶石,所以爲了我們的測試將持續,我想嘲笑時stub_env被調用,像這樣:

before do 
    # tried this with `allow_any_instance_of` as well 
    allow(Module1::Module2::EnvInit).to receive(:stub_env).with('NAME','John Wayne') 
end 

OR

it "should match name to John Wayne" do 
    EnvInit.any_instance.should_receive(:stub_env).with('NAME','John Wayne') 
end 

等我試過嘲笑的各種方式,但我的目標stub_env的作品都沒有。所有stub_env看到是John Doe

簡而言之,我想stub_env通過模擬方式獲得value == John Wayne

+0

'RSpec.configure'部分可能來自一個gem的spec文件。你不應該在你的應用程序中包含這些文件。如果包含該寶石會自動添加寶石的測試設置,那麼這是一個應該修復的嚴重錯誤。 – Stefan

回答

1

嘲笑是將默認行爲更改爲您所需的過程。這就是說,你想模擬stub_env,接收John Doe(因爲它在現實生活中收到"John Doe")並且將"John Wayne"改爲ENV代替。

allow_any_instance_of(Module1::Module2::EnvInit).to \ 
    receive(:stub_env). 
    with('NAME', 'John Doe'). 
    and_return stub_const('ENV', ENV.to_hash.merge('NAME => 'John Wayne')) 
+0

我剛剛嘗試過,但沒有骰子。您好像正在返回與我想要保留的值(John Wayne)相同的'stub_const'行,而另一個更改是通過()將值提供給硬編碼的值。仍然無法針對有問題的方法。 – foxlance

+0

一個不能嘲笑來電者。可以嘲笑被調查者。另外,我不明白爲什麼上面的方法不適合你。 – mudasobwa

+0

對於我來說,理想的解決方案就是在'stub_const('ENV',ENV.to_hash.merge(name => value)')之前將第5行上的binding.pry放在''處,並且'value'返回'John Wayne'。用你的建議,「價值== John Doe」。如果我'退出',我的測試失敗。 感謝您的關注。我期待明天回到這次談話的第一件事。 – foxlance