希望有人能帮我提供一些基本的Sinatra测试帮助。。。
我有一个玩具sinatra应用程序,它实现了这个基本端点,它调用了一个同名的方法:
get '/hello' do
hello
end
def hello
"hello"
end
然后我有这3种规格。第一次和第三次通过,但第二次失败:
context 'get /hello' do
let(:app) { App.new! }
it 'responds to hello' do
expect(app).to respond_to :hello
end
it 'calls hello' do
expect(app).to receive(:hello)
get '/hello'
end
it 'returns hello' do
let(:response) { get '/hello' }
expect(response.status).to eq 200
expect(response.body).to eq "hello"
end
end
未调用错误:
expected: 1 time with any arguments
received: 0 times with any arguments
第一个规范证明了该方法的存在,第三个规范证明它实际上是在用rspec调用该方法。我不确定我错过了什么来获得第二规格的工作
由于您使用的是Rack::Test
,因此需要提供一个名为app
的方法来返回要模拟的应用程序,而不是将let
与App.new!
一起使用。类似这样的东西:
RSpec.describe 'app' do
include Rack::Test::Methods
def app
Sinatra::Application
end
context 'get /hello' do
before { get '/hello' }
it { expect(last_response.status).to eq(200) }
it { expect(last_response.body).to eq('hello') }
end
有关app
方法的更多信息,请参阅Sinatra测试文档。
FWIW我不会为您的示例中的前两个测试编写机架级测试。它不必要地将实现与测试耦合起来。我会直接测试hello
方法。