我正在设置一个基本模板,用于在rails应用程序中进行水豚功能测试.我也使用MiniTest而不是RSPEC.
运行Rake测试似乎没有进行我的功能测试.我在文件中有一个测试,运行rake测试不会改变断言的数量.当我运行rake测试时,跳过测试也不会显示.
以下是存储库的链接:https://github.com/rrgayhart/rails_template
以下是我遵循的步骤
我将它添加到Gemfile并运行bundle
group :development, :test do
gem 'capybara'
gem 'capybara_minitest_spec'
gem 'launchy'
end
Run Code Online (Sandbox Code Playgroud)我将其添加到test_helper中
require 'capybara/rails'
Run Code Online (Sandbox Code Playgroud)我创建了一个文件夹测试/功能
我创建了一个名为drink_creation_test.rb的文件
以下是该功能测试文件的代码
require 'test_helper'
class DrinkCreationTest < MiniTest::Unit::TestCase
def test_it_creates_an_drink_with_a_title_and_body
visit drinks_path
click_on 'new-drink'
fill_in 'name', :with => "PBR"
fill_in 'description', :with => "This is a great beer."
fill_in 'price', :with => 7.99
fill_in 'category_id', :with => 1
click_on 'save-drink'
within('#title') do
assert page.has_content?("PBR")
end
within('#description') do
assert page.has_content?("td", text: "This is a great beer")
end
end …Run Code Online (Sandbox Code Playgroud)我正在尝试在我的Exercism文件夹中设置Guard,以便所有测试都自动运行(使用guard-minitest).
文件夹结构如下所示:
.
??? exercism
??? ruby
??? bob
? ??? bob.rb
? ??? bob_test.rb
??? etl
? ??? etl.rb
? ??? etl_test.rb
...
??? binary_search_tree
??? bst.rb
??? binary_search_tree.rb
??? README.md
Run Code Online (Sandbox Code Playgroud)
由于不常见的文件夹结构,我在Guardfile中进行了以下配置:
# tell Guard to watch all folders under ruby/
all_dirs = Dir.glob('ruby/*')
directories all_dirs
options = {
test_folders: all_dirs,
test_file_patterns: '*_test.rb',
pride: true
}
guard :minitest, options do
watch(%r{^ruby/([^/]+)/([^/]+).rb$})
end
Run Code Online (Sandbox Code Playgroud)
通过此设置,我希望在对.rb文件进行任何编辑后运行所有测试.
我在调试模式下运行后卫.
正如所料,所有测试都在启动时运行.
但是,当我编辑.rb文件时,测试不会再次运行,尽管Guard输出:
20:43:26 - DEBUG - Interactor was stopped or killed
20:43:26 - DEBUG - …Run Code Online (Sandbox Code Playgroud) 当我运行 rake db:test:prepare 时,我总是收到以下错误。什么会导致这种情况?rake db:create 工作正常。
Adam-MacBook-Pro:katy adam$ bundle exec rake db:test:prepare
rake aborted!
NoMethodError: undefined method `[]' for nil:NilClass
/Users/adam/.rvm/gems/ruby-2.2.2/gems/activerecord-4.2.4/lib/active_record/tasks/database_tasks.rb:163:in `purge'
/Users/adam/.rvm/gems/ruby-2.2.2/gems/activerecord-4.2.4/lib/active_record/railties/databases.rake:356:in `block (3 levels) in <top (required)>'
/Users/adam/.rvm/gems/ruby-2.2.2/gems/activerecord-4.2.4/lib/active_record/railties/databases.rake:362:in `block (3 levels) in <top (required)>'
/Users/adam/.rvm/gems/ruby-2.2.2/bin/ruby_executable_hooks:15:in `eval'
/Users/adam/.rvm/gems/ruby-2.2.2/bin/ruby_executable_hooks:15:in `<main>'
Run Code Online (Sandbox Code Playgroud)
数据库.yml
<%= Rails.env %>:
adapter: mysql2
encoding: utf8
pool: <%= ENV['DB_POOL'] || 5 %>
username: <%= ENV['DB_USER'] || 'root' %>
password: <%= ENV['DB_PASSWORD'] || nil %>
timeout: <%= ENV['DB_TIMEOUT'] || 5000 %>
host: <%= ENV['DB_HOST'] || 'localhost' %>
port: <%= …Run Code Online (Sandbox Code Playgroud) 我的 Rails 应用程序中有一个名为reports的控制器。该控制器有 4 或 5 个(报告)操作,并且文件不是很大。
我正在使用小型测试来测试我的应用程序。该控制器的测试文件
(reports_controller_test.rb)太大。我只想分解每个报告的测试文件,以便我可以单独为每个报告编写测试。我真的可以将1 个小型测试文件拆分为许多测试文件吗?
我正在尝试使用 minitest 访问控制器内的实例变量。
例如:
microposts_controller.rb:
def destroy
p "*"*40
p @cats = 42
end
Run Code Online (Sandbox Code Playgroud)
@cats我将如何测试with inside with minitest的值microposts_controller_test.rb?
我知道我可以delete从浏览器提交请求并检查我的服务器日志并找到:
"****************************************"
42
Run Code Online (Sandbox Code Playgroud)
我在另一个答案中读到,我可以访问assigns包含所有实例变量的哈希,但它不起作用。我也尝试过查看该controller物体的内部。如下图所示:
microposts_controller.rb:
test "@cats should exist in destroy method" do
delete micropost_path(@micropost)
p controller.instance_variables
p assigns[:cats]
end
Run Code Online (Sandbox Code Playgroud)
输出:
[:@_action_has_layout, :@_routes, :@_request, :@_response, :@_lookup_context, :@_action_name, :@_response_body, :@marked_for_same_origin_verification, :@_config, :@_url_options]0:04
nil
Run Code Online (Sandbox Code Playgroud)
我期望看到对象@cats内部的实例变量controller。我也期待看到42输出。
我在这里缺少什么?
我创建了一个发出 HTTParty get 请求的函数。它会引发我需要测试的自定义错误消息。我尝试在测试中使用 Webmock 来存根请求,但它引发了<Net::OpenTimeout>. 如果 url 是动态构造的,我如何存根 get 请求?
def function(a , b)
# some logic , dynamic url constructed
response = HTTParty.get(url, headers: {"Content-Type" =>
"application/json"})
if response.code != 200
raise CustomError.new <<~EOF
Error while fetching job details.
Response code: #{response.code}
Response body: #{response.body}
EOF
end
JSON.parse(response.body)
Run Code Online (Sandbox Code Playgroud)
为了测试
def test_function
WebMock.stub_request(:get, url).with(:headers => {'Content-
Type'=>'application/json'}).to_return(:status => 500)
# HTTParty.stub(get: fake_response)
err = assert_raises CustumError do
c.function(a , b)
end
Run Code Online (Sandbox Code Playgroud) 升级到Rails 6.1后,测试失败:
class MyJob < ActiveJob::Base
class MyError < StandardError; end
def perform
raise MyError
end
end
describe MyJob, type: :job do
it "throws an error" do
expect do
perform_enqueued_jobs { MyJob.perform_later }
end.to raise_error(described_class::MyError)
end
end
Run Code Online (Sandbox Code Playgroud)
此规范因错误而失败
expected MyJob::MyError, got #<Minitest::UnexpectedError: Unexpected exception> with backtrace:
Run Code Online (Sandbox Code Playgroud)
仔细观察抛出的错误,它看起来像这样:
69:
70: describe MyJob, type: :job do
71: it "throws an error" do
72: expect do
73: binding.pry
=> 74: perform_enqueued_jobs { MyJob.perform_later }
75: end.to raise_error(described_class::MyError)
76: end
77: end
[1] pry(#<RSpec::ExampleGroups::MyJob>)> …Run Code Online (Sandbox Code Playgroud) 在使用Devise的Rails 3.28应用程序中,我设置了一个控制器,用于检查用户是否登录if user_signed_in?.一旦测试达到这条线,我总是会收到undefined method 'authenticate!' for nil:NilClass错误.我想在没有用户登录的场景中测试一些代码.
我想,我需要设置的测试根据在设计维基指定的选项在这里,但是,所有的说明适用于rspec的.
特别是,我认为我需要有以下工作在minitest:
RSpec.configure do |config|
config.include Devise::TestHelpers, :type => :controller
config.extend ControllerMacros, :type => :controller
end
Run Code Online (Sandbox Code Playgroud)
有没有人成功设置Devise与minitest合作?
在为单元测试创建辅助方法时,故障的控制台输出仅指示实际断言发生的行.
# Just an example method.
def test_equal(a, b)
assert_equal a, b # Error indicates this line
end
test_equal(1, 2) # I'd like to know this line
test_equal(2, 3)
Run Code Online (Sandbox Code Playgroud)
有没有办法显示类似"回溯"的内容或为这些断言错误提供更多上下文?
我在测试数据库时遇到错误.
我有两个型号.当我添加第二个和Active Admin gem时,我开始收到错误.
bundle exec rake test:models --trace
** Invoke test:models (first_time)
** Invoke test:prepare (first_time)
** Execute test:prepare
** Execute test:models
rake aborted!
LoadError: cannot load such file -- minitest/reporters
/Users/nischaynamdev/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/activesupport-4.2.2/lib/active_support/dependencies.rb:274:in `require'
/Users/nischaynamdev/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/activesupport-4.2.2/lib/active_support/dependencies.rb:274:in `block in require'
/Users/nischaynamdev/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/activesupport-4.2.2/lib/active_support/dependencies.rb:240:in `load_dependency'
/Users/nischaynamdev/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/activesupport-4.2.2/lib/active_support/dependencies.rb:274:in `require'
/Users/nischaynamdev/RubymineProjects/hostel_mess_pay/test/test_helper.rb:4:in `<top (required)>'
/Users/nischaynamdev/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/activesupport-4.2.2/lib/active_support/dependencies.rb:274:in `require'
/Users/nischaynamdev/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/activesupport-4.2.2/lib/active_support/dependencies.rb:274:in `block in require'
/Users/nischaynamdev/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/activesupport-4.2.2/lib/active_support/dependencies.rb:240:in `load_dependency'
/Users/nischaynamdev/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/activesupport-4.2.2/lib/active_support/dependencies.rb:274:in `require'
/Users/nischaynamdev/RubymineProjects/hostel_mess_pay/test/models/admin_user_test.rb:1:in `<top (required)>'
/Users/nischaynamdev/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/activesupport-4.2.2/lib/active_support/dependencies.rb:274:in `require'
/Users/nischaynamdev/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/activesupport-4.2.2/lib/active_support/dependencies.rb:274:in `block in require'
/Users/nischaynamdev/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/activesupport-4.2.2/lib/active_support/dependencies.rb:240:in `load_dependency'
/Users/nischaynamdev/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/activesupport-4.2.2/lib/active_support/dependencies.rb:274:in `require'
/Users/nischaynamdev/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/railties-4.2.2/lib/rails/test_unit/sub_test_task.rb:114:in `block (3 levels) in define'
/Users/nischaynamdev/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/railties-4.2.2/lib/rails/test_unit/sub_test_task.rb:114:in `each'
/Users/nischaynamdev/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/railties-4.2.2/lib/rails/test_unit/sub_test_task.rb:114:in `block (2 levels) …Run Code Online (Sandbox Code Playgroud)