我正在编写一个单元测试,其中一个正在返回一个zip文件,我想检查这个zip文件的内容,从中获取一些值,并将值传递给下一个测试.
我正在使用Rack Test,所以我知道我的zip文件的内容在里面last_response.body.我查看了RubyZip的文档,但似乎总是期待一个文件.由于我正在运行单元测试,我更喜欢在内存中完成所有操作,以免污染任何带有测试zip文件的文件夹,如果可能的话.
我一直低着头,觉得我可能犯了一个简单的错误,但我一直无法找到有关这个问题的任何信息.
我有一些Rails 5的请求规范,当我测试重定向时 - 但不是渲染模板 - 我得到一个错误,undefined method 'response_code' for nil:NilClass.这样做的原因似乎是,@response是nil,当匹配被称为(内ActionDispatch ::断言:: ResponseAssertions代码,而不是在我的代码).我能够使用cURL向API发出请求,并按预期返回响应.返回错误的位置在这里(这是ActionDispatch代码):
def generate_response_message(expected, actual = @response.response_code)
"Expected response to be a <#{code_with_name(expected)}>,"\
" but was a <#{code_with_name(actual)}>"
.dup.concat(location_if_redirected).concat(response_body_if_short)
end
Run Code Online (Sandbox Code Playgroud)
注意第一行,其中actualparam 的默认值设置为@response.response_code.
这是我的测试代码:
RSpec.describe "Admin registrations", type: :request do
describe "new sign-up" do
subject { get new_admin_registration_path }
it "redirects to home" do
expect(subject).to redirect_to(new_admin_session_path)
end
end
end
Run Code Online (Sandbox Code Playgroud)
测试日志中的相关行是:
Started GET "/admins/sign_up" for 127.0.0.1 at 2018-07-05 10:44:05 -0700
Processing …Run Code Online (Sandbox Code Playgroud) 我想掌握由 rack-test 测试的应用程序实例,以便我可以模拟它的一些方法。我以为我可以简单地将应用程序实例保存在app方法中,但由于某些奇怪的原因不起作用。似乎rack-test只是使用实例来获取类,然后创建自己的实例。
我做了一个测试来证明我的问题(它需要运行宝石“sinatra”、“rack-test”和“rr”):
require "sinatra"
require "minitest/spec"
require "minitest/autorun"
require "rack/test"
require "rr"
describe "instantiated app" do
include Rack::Test::Methods
def app
cls = Class.new(Sinatra::Base) do
get "/foo" do
$instance_id = self.object_id
generate_response
end
def generate_response
[200, {"Content-Type" => "text/plain"}, "I am a response"]
end
end
# Instantiate the actual class, and not a wrapped class made by Sinatra
@app = cls.new!
return @app
end
it "should have the same object id inside response handlers" do …Run Code Online (Sandbox Code Playgroud) 我正在尝试为我使用 Sinatra 构建的 REST API 构建单元测试。现在我只想测试我的回声功能是否正常工作。Echo 使用 POST 并将从帖子中返回完全相同的有效负载。我对 ruby 还是个新手,所以如果我不使用正确的术语,请原谅我。
这是我要测试的代码:
post '/echo' do
request.body.read
end
Run Code Online (Sandbox Code Playgroud)
这是我正在尝试进行的单元测试:
ENV['RACK_ENV'] = 'test'
require './rest_server'
require 'test/unit'
require 'rack/test'
require 'json'
class RestServer < Test::Unit::TestCase
def app
Sinatra::Application
end
def test_check_methods
data = '{"dataIn": "hello"}'
response = post '/echo', JSON.parse(data)
assert.last_response.ok?
assert(response.body == data)
end
end
Run Code Online (Sandbox Code Playgroud)
使用上面的代码,这里是错误:
NoMethodError: undefined method `dataIn' for Sinatra::Application:Class
/Users/barrywilliams/.rvm/gems/ruby-1.9.3-p448/gems/sinatra-1.3.4/lib/sinatra/base.rb:1285:in `block in compile!'
/Users/barrywilliams/.rvm/gems/ruby-1.9.3-p448/gems/sinatra-1.3.4/lib/sinatra/base.rb:1285:in `each_pair'
/Users/barrywilliams/.rvm/gems/ruby-1.9.3-p448/gems/sinatra-1.3.4/lib/sinatra/base.rb:1285:in `compile!'
/Users/barrywilliams/.rvm/gems/ruby-1.9.3-p448/gems/sinatra-1.3.4/lib/sinatra/base.rb:1267:in `route'
/Users/barrywilliams/.rvm/gems/ruby-1.9.3-p448/gems/sinatra-1.3.4/lib/sinatra/base.rb:1256:in `post'
/Users/barrywilliams/.rvm/gems/ruby-1.9.3-p448/gems/sinatra-1.3.4/lib/sinatra/base.rb:1688:in `block (2 levels) in delegate'
/Users/barrywilliams/RubymineProjects/project/rest_server_test.rb:20:in …Run Code Online (Sandbox Code Playgroud) 我正在尝试按照Yehuda Katz 的书《Rails 3 in Action》第 13 章中提供的Ticketee示例为我的 Ruby 项目创建一个 JSON API 。这是第 353 页上描述的适合我的环境的 RSpec 测试。
# /spec/api/v1/farms_spec.rb # Reduced to the minimum code.
require "spec_helper"
include ApiHelper # not sure if I need this
describe "/api/v1/farms", type: :api do
context "farms viewable by this user" do
let(:url) { "/api/v1/farms" }
it "json" do
get "#{url}.json"
assert last_response.ok?
end
end
end
Run Code Online (Sandbox Code Playgroud)
当我运行测试时,我得到以下输出......
$ rspec spec/api/v1/farms_spec.rb
No DRb server is running. Running in local process instead ... …Run Code Online (Sandbox Code Playgroud) 给定代码
env "rack.session", {:var => 'value'}
Run Code Online (Sandbox Code Playgroud)
我可以在机架测试中设置会话变量。但是,我如何(使用机架测试)测试 RSpec 中的所述会话变量?假设一下,例如:
expect(env['rack.session'][:var]).to eq('value')
Run Code Online (Sandbox Code Playgroud)
我似乎找不到任何读取 Rack 环境变量的文档,只能写入它们。
我花了大约两天时间尝试使用 Rack::Test 发送自定义标头,但没有成功。我只是无法将任何标头发送到我的应用程序中。我在网上找到了很多类似代码的例子——方法(地址、正文、标题),但对我来说它们根本不起作用。
ruby 2.5.1p57 (2018-03-29 修订版 63029) [x86_64-linux]
# grep rack Gemfile.lock
rack (2.0.4)
rack-protection (2.0.1)
rack
rack-test (1.0.0)
rack (>= 1.0, < 3)
rack-protection (>= 1.5.0)
rack (~> 2.0)
rack-protection (= 2.0.1)
rack-test
Run Code Online (Sandbox Code Playgroud)
应用程序中的代码(sinatra):
$log = Logger.new STDERR
class MyApi < Sinatra::Application
before do
$log.debug{ "Headers: #{ headers.keys.inspect }" }
end
get '/offers' do
#... some code
end
post '/offers' do
# .. some another code
end
end
Run Code Online (Sandbox Code Playgroud)
规格/api_spec.rb
RSpec.describe MyApi, '/offers' do
include Rack::Test::Methods
def app
MyApi …Run Code Online (Sandbox Code Playgroud) 如何测试Rails中控制器操作的响应是否为文件?(机架测试或水豚)
我应该使用单元测试吗?
场景很简单:我必须测试来自数据库的导出用户是否与动作生成的.csv中包含的用户相同.