测试是否应Sinatra请求调用了方法



希望有人能帮我提供一些基本的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的方法来返回要模拟的应用程序,而不是将letApp.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方法。

最新更新