【问题标题】:rails integration testing issuesrails集成测试问题
【发布时间】:2012-03-27 22:55:05
【问题描述】:

我正在尝试使用 Rails 自己的测试系统在 Rails 教程中出现的用户模型上进行一些集成测试。

在 routes.rb 我做了以下映射:

match '/signup',  to: 'users#new'

测试看起来像这样:

class UserStoriesTest < ActionDispatch::IntegrationTest
  test "sign up" do
    User.delete_all
    post_via_redirect "/users",  
           user: {name: 'david', 
                  email: 'david@example.com', 
                  password: 'qwe123', 
                  password_confirmation: 'qwe123'}
    assert_response :success
    users = User.all
    assert_equal 1, users.size, users.size   
  end
end

无论我做什么,我都不能让它创建一个新记录,所以第二个断言失败了。 我还尝试通过设置错误的确认密码故意使其失败,并且在第一次断言时没有失败。 我尝试只发布而不是 post_via_redirect,或者使用“注册”路径而不是“/用户”,没有任何变化。

我肯定在做一些愚蠢的事情。我在这里想念什么?

问候。

【问题讨论】:

    标签: ruby-on-rails integration-testing


    【解决方案1】:

    您实际上并未填写注册表单。看起来你在使用 test::unit,你需要 webrat 或 capybara 来处理请求规范,我推荐后者。

    https://github.com/jnicklas/capybara

    https://github.com/brynary/webrat

    【讨论】:

      【解决方案2】:

      这个回复可能太老了,对你没有多大用处,但有几件事对我来说很突出。

      1) 这不应该是集成测试,因为您没有测试多个控制器之间的交互。这应该是一个功能测试,用于测试单个控制器,在本例中是您的 UsersController。这很重要,因为根据您的声明,可以使用/加载不同的方法和函数。

      class UserStoriesTest < ActionDispatch::IntegrationTest
      

      会给你一个非常不同的环境

      class UserTest < ActiveSupport::TestCase
      

      请注意,集成测试是 ActionDispatch 的一部分,而功能测试是 ActiveSupport 的一部分。我强烈建议将此移至功能测试,这可能是您的错误的根源。

      2) 使用 delete_all 有点极端。实际上,您可以在发布帖子时进行断言测试,以查看计数是否存在差异。

      assert_difference('User.count') do
        post :create, :user => {name: 'david', 
                    email: 'david@example.com', 
                    password: 'qwe123', 
                    password_confirmation: 'qwe123'}
      end
      

      这将断言 User.count 与您运行 do 循环中的内容之前和结束时不同。那里的那个块可以替换您在“注册”测试中拥有的所有内容。为了好玩,您可以将 assert_difference 更改为 assert_no_difference,如果通过了,您就知道您的 users_controller.rb 中的 post 方法有问题(这是我假设您的问题实际上所在的地方)。

      3) 你的 assert_equal 行看起来有点奇怪。传递的最后一个参数是失败时将吐出的消息。只打印一个数字可能适用于一次测试,但在许多测试中看起来很奇怪。我认为以下内容更接近规范:

      assert_equal 1, User.count, "Expected User.count to be equal to 1, instead it is equal to: " + User.count.to_s
      

      还请注意,您可以只使用 ModelName.count,而不是执行诸如将所有记录放入一个对象然后调用该对象的大小之类的操作。这会很快变得非常混乱。

      最后,作为一个通用的调试工具,你可以到处抛出 puts 语句或 logger 语句来查看实际发生了什么。

      puts User.count
      

      在你的 delete_all 和你的 post_via_redirect 之后会很快告诉你哪里出了问题。如果你使用 logger 方法,它将被写入你的 appname/log/ENV.log 中的日志。因此,如果您正在运行测试,它将在 test.log 中。

      logger.debug User.count
      

      您的日志还将保留所有请求的记录,因此您可以阅读并查看您是否获得了 200 次 OK、302 次重定向等。

      我建议查看 rails 提供的以下指南,它们是很好的起点:

      http://guides.rubyonrails.org/testing.html

      http://guides.rubyonrails.org/debugging_rails_applications.html

      希望这对某人有所帮助!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-02-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-23
        • 1970-01-01
        相关资源
        最近更新 更多