标签: minitest

捕获Ruby Logger输出以进行测试

我有一个像这样的ruby类:

require 'logger'
class T
  def do_something
    log = Logger.new(STDERR)
    log.info("Here is an info message")
  end
end
Run Code Online (Sandbox Code Playgroud)

这个测试脚本排成一行:

#!/usr/bin/env ruby

gem "minitest"
require 'minitest/autorun'

require_relative 't'

class TestMailProcessorClasses < Minitest::Test
  def test_it
    me = T.new

    out, err = capture_io do
      me.do_something
    end

    puts "Out is '#{out}'"
    puts "err is '#{err}'"
  end
end
Run Code Online (Sandbox Code Playgroud)

当我运行此测试时,out和err都是空字符串.我看到消息打印在stderr上(在终端上).有没有办法让Logger和capture_io很好地一起玩?

我处于直接的Ruby环境中,而不是Ruby on Rails.

ruby logging minitest

5
推荐指数
2
解决办法
2497
查看次数

Minitest 的 assert_select 的水豚相当于什么?

我对测试很陌生,所以如果我的方法有问题,请随时纠正我。

我正在使用 Minitest 测试 Rails4 应用程序。由于我在许多页面中都包含了 JS,因此我使用 Capybara 在我的测试中包含 JS 驱动程序,并且还能够触发 JS 事件并测试预期结果。我的困惑由此开始,因为包含 Capybara 的方法有很多。

此外,我发现“普通”断言式语法不适用于 Capybara。在这里,我的困惑达到了顶峰。在我的研究中,我发现 Capybara 有一个 Spec 风格的 DSL 以及更多。现在我使用 gem 'minitest-rails-capybara' ( Github ),我尝试使用这个列表中的方法/DSL:RubyDoc

我试图替换一个测试 HTML 元素的简单断言。

前: assert_select "title", "Study | Word Up"

现在: page.has_selector?('title', :text => "Study | Word Up")

但无论我测试什么,测试总是通过。这怎么可能?我检查了服务器日志,看看我是否在正确的页面上。但一切似乎都很好,通过测试没有意义。

javascript ruby ruby-on-rails minitest capybara

5
推荐指数
1
解决办法
1233
查看次数

如何使用MiniTest测试记录器消息?

我有一个应用程序,我想测试我是否从记录器中获得正确的消息.

一个简短的例子(你可以在log4r和logger之间切换):

gem 'minitest'
require 'minitest/autorun'
require 'log4r'
#~ require 'logger'
class Testlog < MiniTest::Test
  def setup
    if defined? Log4r
      @log = Log4r::Logger.new('log')
      @log.outputters << Log4r::StdoutOutputter.new('stdout', :level => Log4r::INFO)
    else
      @log = Logger.new(STDOUT)
      @log.level = Logger::INFO
    end
  end

  def test_silent
    assert_silent{ @log.debug("hello world") }
    assert_output(nil,nil){ @log.debug("Hello World") }
  end
  def test_output
    #~ refute_silent{ @log.INFO("Hello") }#-> NoMethodError: undefined method `refute_silent'        
    assert_output("INFO log: Hello World\n",''){ @log.info("Hello World") }
  end

end
Run Code Online (Sandbox Code Playgroud)

但我得到:

  1) Failure:
Testlog#test_output [minitest_log4r.rb:27]:
In stdout.
Expected: "INFO log: Hello World\n" …
Run Code Online (Sandbox Code Playgroud)

ruby logging unit-testing log4r minitest

5
推荐指数
1
解决办法
1661
查看次数

使用 Minitest 测试自定义验证器

我有多个带有电子邮件验证的模型。因此,我已将验证提取到自定义验证器中。我按照Rails Guides的教程进行了修改。

class EmailValidator < ActiveModel::EachValidator
  def validate_each(record, attribute, value)
    unless value =~ /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\z/i
      record.errors[attribute] << (options[:message] || "is not an email")
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

到现在为止还挺好。但是由于我已经将电子邮件验证的功能提取到了它自己的范围内,所以我也想单独测试它。我不想为每个模型添加相同的电子邮件格式测试。

我发现了另一个问题,它也问了同样的问题,但对于 RSpec。但是由于我还没有使用过存根和模拟,我不知道如何将测试移植到 Minitest 测试中。我还没有找到任何使用 Minitest 测试自定义验证器的资源。

有谁知道如何在 Minitest 中为自定义验证器编写此类测试(不使用规范!)?

validation unit-testing ruby-on-rails custom-validators minitest

5
推荐指数
1
解决办法
1734
查看次数

5
推荐指数
1
解决办法
497
查看次数

MiniTest身份验证

我是MiniTest的新手.大多数测试都很容易掌握,因为它是Ruby代码,并且还具有Rspec风格的可读性.但是,我在身份验证方面遇到了麻烦.与任何应用程序一样,大多数控制器都隐藏在某种身份验证之后,最常见的是authenticate_user确保用户登录.

如何测试session- >用户已登录?我从头开始使用身份验证而不是设计.

我确实将此作为参考:https://github.com/chriskottom/minitest_cookbook_source/blob/master/minishop/test/support/session_helpers.rb

但不太确定如何实现它.

让我们使用它作为示例控制器:

class ProductsController < ApplicationController
  before_action :authenticate_user

  def index
    @products = Product.all
  end

  def show
   @product = Product.find(params[:id])
  end

end
Run Code Online (Sandbox Code Playgroud)

在这些基本实例中,我的测试如何?

test "it should GET products index" do
  # insert code to check authenticate_user
  get :index
  assert_response :success
end

test "it should GET products show" do
  # insert code to check authenticate_user
  get :show
  assert_response :success
end

#refactor so logged in only has to be defined once across …
Run Code Online (Sandbox Code Playgroud)

ruby testing controller ruby-on-rails minitest

5
推荐指数
1
解决办法
835
查看次数

如何测试 Apartment、Minitest、Capybara 和 Selenium

我是 Minitest 和 Apartment 的新手,很难正确配置环境以运行测试用例。我想使用 Capybara & Selenium 进行验收测试。当我运行测试时,我收到以下错误消息:

Apartment::TenantNotFound:         Apartment::TenantNotFound: One of the following schema(s) is invalid: "test-tenant" "public"
Run Code Online (Sandbox Code Playgroud)

所以似乎没有正确创建租户。Apartment gem 有关于如何将它与 Rspec 一起使用的说明,但我不知道如何在 Minitest 中进行类似的设置。应该如何定义租户,以便 Minitest 可以看到它们?

我的 test_helpers.rb:

ENV['RAILS_ENV'] ||= 'test'
require File.expand_path('../../config/environment', __FILE__)
require 'rails/test_help'
require "minitest/reporters"
require "minitest/rails/capybara"
Minitest::Reporters.use!

class ActiveSupport::TestCase
  # Setup all fixtures in test/fixtures/*.yml for all tests in alphabetical order.
  fixtures :all
end

class ActionController::TestCase
  include Devise::TestHelpers
end

class ActionDispatch::IntegrationTest
end
Run Code Online (Sandbox Code Playgroud)

和测试用例:

require "test_helper"

class LoginTest < Capybara::Rails::TestCase
  def setup
    Apartment::Tenant.drop( "test-tenant" …
Run Code Online (Sandbox Code Playgroud)

selenium ruby-on-rails minitest capybara apartment-gem

5
推荐指数
1
解决办法
1778
查看次数

未定义的方法:Minitest 中的 assert_not_nil

我正在尝试执行以下代码,但它给了我一个未定义的方法错误:

require 'minitest/autorun'
require 'string_extension'

class StringExtensionTest < Minitest::Test
  def test_humanize_returns_nothing
    assert_not_nil "Yo".humanize, "humanize is returning nil."
  end
end
Run Code Online (Sandbox Code Playgroud)

我正在尝试从 Codeschool 的 Rails 课程中执行这段代码,但似乎没有方法assert_not_nil。我还检查了 MiniTest 框架的文档,那里没有定义它,但我不确定。

ruby testunit minitest

5
推荐指数
2
解决办法
6095
查看次数

使用 rspec 运行 Rails-tutorial 时 nil:NilClass 的未定义方法“文档”

我正在关注railstutorial by Michael Hartl,但我不明白第 5 章中测试失败的原因。这本书使用了 minitest 框架,但我决定使用 RSpec。为此,我删除了 test 文件夹并将其包含rspec-rails在我的 Gemfile 中,然后运行 ​​bundle install 并rails g rspec:install生成我的 spec 文件夹。但是,我觉得使用 minitest 语法运行一些测试很方便,例如assert_select在static_pages_controller_spec.rb文件中。这是我的规范文件的样子:

require "rails_helper"

RSpec.describe StaticPagesController, type: :controller do
  describe "GET #home" do
    it "returns http success" do
      get :home
      expect(response).to have_http_status(:success)
    end
    it "should have the right title" do
      get :home
      assert_select "title", "Ruby on Rails Tutorial Sample App"
    end
  end

  describe "GET #help" do
    it "returns http success" …
Run Code Online (Sandbox Code Playgroud)

minitest rspec-rails railstutorial.org ruby-on-rails-4

5
推荐指数
1
解决办法
1495
查看次数

测试设计用户登录但得到 401 未经授权的响应

我使用的是devise_auth_token创业板rails-api应用程序,其中我试图测试,如果userlogged_inuser有权render通过index在行动welcome_controller

欢迎控制器

class Api::WelcomeController < ApplicationController
  before_action :authenticate_user!

  def index
    render json: {
      data: {
        message: "Welcome #{current_user.first_name}",
        user: current_user
      }
    }, status: 200
  end
end
Run Code Online (Sandbox Code Playgroud)

路线

Rails.application.routes.draw do
  mount_devise_token_auth_for 'User', at: 'auth'
  namespace :api do
    get 'welcome', to: 'welcome#index'
    resources :socities
  end
end
Run Code Online (Sandbox Code Playgroud)

Welcome_controller_test

require 'test_helper'

class Api::WelcomeControllerTest < ActionDispatch::IntegrationTest
  def test_index_renders_message
    admin = users :admin
    sign_in admin
    get "/api/welcome"
    assert_response :success
  end …
Run Code Online (Sandbox Code Playgroud)

ruby ruby-on-rails minitest devise rails-api

5
推荐指数
0
解决办法
748
查看次数