存根或模拟实例方法 rspec
Stub or mock instance method rspec
下面的函数是一个控制器操作,它获取要从 AWS S3 存储桶提供的数据。
def show
s3_response = Zlib::GzipReader.new(ApiBucket.bucket.object(id).get.body).read
render json: s3_response
end
我正在为此方法编写规范。我需要 stub/mock 这样 s3_response
实际上不会从 s3 请求。这是我试过的。但这不起作用。请帮忙。
describe '#GET show' do
let!(:resource) { create(:resource) }
before do
json_data = Api::V2::Presenter.consume_as_json(resource)
allow_any_instance_of(Zlib::GzipReader).to receive(:read).and_return(json_data)
end
it 'should return the resource in page format' do
get :show, format: :json, params: { id: resource.uuid }
response_body_json = JSON.parse(response.body)
json_data = Api::V2::Presenter.consume_as_json(
Api::V2::ResourcePresenter.new(resource).page,
true
)
expect(response_body_json).to eql(JSON.parse(json_data))
end
end
我遇到了这个错误Zlib::GzipFile::Error: not in gzip format
而不是存根 Zlib::GzipReader
或 S3 Bucket
。处理这种情况的一种简单易行的方法是在控制器中创建一个新的私有函数,然后存根该控制器函数。
在控制器端:
def show
render json: s3_response
end
private:
def s3_response
Zlib::GzipReader.new(ApiBucket.bucket.object(id).get.body).read
end
规格为:
describe '#GET show' do
let!(:resource) { create(:resource) }
before do
json_data = Api::V2::Presenter.consume_as_json(resource)
ResourceController.any_instance.stub(:s3_response).and_return(json_data)
end
it 'should return the resource in page format' do
get :show, format: :json, params: { id: resource.uuid }
response_body_json = JSON.parse(response.body)
json_data = Api::V2::Presenter.consume_as_json(
Api::V2::Presenter.new(resource).page,
true
)
expect(response_body_json).to eql(JSON.parse(json_data))
end
end
下面的函数是一个控制器操作,它获取要从 AWS S3 存储桶提供的数据。
def show
s3_response = Zlib::GzipReader.new(ApiBucket.bucket.object(id).get.body).read
render json: s3_response
end
我正在为此方法编写规范。我需要 stub/mock 这样 s3_response
实际上不会从 s3 请求。这是我试过的。但这不起作用。请帮忙。
describe '#GET show' do
let!(:resource) { create(:resource) }
before do
json_data = Api::V2::Presenter.consume_as_json(resource)
allow_any_instance_of(Zlib::GzipReader).to receive(:read).and_return(json_data)
end
it 'should return the resource in page format' do
get :show, format: :json, params: { id: resource.uuid }
response_body_json = JSON.parse(response.body)
json_data = Api::V2::Presenter.consume_as_json(
Api::V2::ResourcePresenter.new(resource).page,
true
)
expect(response_body_json).to eql(JSON.parse(json_data))
end
end
我遇到了这个错误Zlib::GzipFile::Error: not in gzip format
而不是存根 Zlib::GzipReader
或 S3 Bucket
。处理这种情况的一种简单易行的方法是在控制器中创建一个新的私有函数,然后存根该控制器函数。
在控制器端:
def show
render json: s3_response
end
private:
def s3_response
Zlib::GzipReader.new(ApiBucket.bucket.object(id).get.body).read
end
规格为:
describe '#GET show' do
let!(:resource) { create(:resource) }
before do
json_data = Api::V2::Presenter.consume_as_json(resource)
ResourceController.any_instance.stub(:s3_response).and_return(json_data)
end
it 'should return the resource in page format' do
get :show, format: :json, params: { id: resource.uuid }
response_body_json = JSON.parse(response.body)
json_data = Api::V2::Presenter.consume_as_json(
Api::V2::Presenter.new(resource).page,
true
)
expect(response_body_json).to eql(JSON.parse(json_data))
end
end