我在调用' POST'时遇到问题。我的测试服只有一次方法。
let(:foo) {post :foo_controller arguments}
it 'FIRST: should validate post response first field' do
expect(foo[:first_field]).to match('something')
end
it 'SECOND: should validate post response second field' do
expect(foo[:second_field]).to match('something else')
end
现在foo" POST"动作被调用两次。 我想说明第一个请求' POST'并获取一个请求值,但SECOND只获取一个值,该值是持久的,而不调用此' POST'。
有没有一种优雅的方法来解决这个问题?
答案 0 :(得分:0)
您可以使用before(:all)块,但不确定实际返回的帖子。
before(:all) do
@my_response = post :foo_controller arguments
end
希望有所帮助!
答案 1 :(得分:0)
我是一个帮助我解决这个问题的小帮手。
这是辅助模块:
module ControllerSpecHelpers
# example:
#
# describe 'my request' do
# examine_response {get '/foo/bar'}
# it {should be_ok}
# end
#
#
def examine_response &block
before(:all) do
self.instance_exec &block
end
subject {last_response}
end
end
我配置Rspec在我的规范助手中使用它:
RSpec.configure do |conf|
# snip ...
conf.extend ControllerSpecHelpers
end
然后当我只需要执行一次调用并测试多个属性时,我就这样使用它:
describe "when signing up" do
examine_response do
post "/signup", {email: 'signup@test.com', password: 'password'}
end
it {should be_ok}
it "body says welcome" do
expect(subject.body).to include 'welcome'
end
end
这里有关于扩展Rspec如何工作的更多细节: http://timnew.github.io/blog/2012/08/05/extend-rspec-dsl/