【问题标题】:RailsTutorial - chapter 8.4.3 - Test database not clearing after adding user in integration testRailsTutorial - 第 8.4.3 章 - 在集成测试中添加用户后未清除测试数据库
【发布时间】:2011-07-24 04:28:30
【问题描述】:

我被这个难住了。

到目前为止,教程中的所有内容都进行得很顺利,但是当我将这段代码添加到我的 /spec/requests/users_spec.rb 文件时,事情开始向南:

describe "success" do

  it "should make a new user" do
    lambda do
      visit signup_path
        fill_in "Name",         :with => "Example User"
        fill_in "Email",        :with => "ryan@example.com"
        fill_in "Password",     :with => "foobar"
        fill_in "Confirmation", :with => "foobar"
        click_button
        response.should have_selector("div.flash.success",
                                      :content => "Welcome")
        response.should render_template('users/show')
        end.should change(User, :count).by(1)
      end
    end

如果我清除测试数据库 ( rake db:test:prepare ),则所有测试都会通过。但是如果我再次运行测试,它们会失败,因为测试数据库没有清除上面代码添加的记录。

我用谷歌搜索了很多,我发现的大部分内容要么指向 config.use_transactional_fixtures 设置,要么指向代码中的嵌套问题。

我很确定这两种情况都不适合我。这是我的 spec_helper.rb 文件:

require 'rubygems'
require 'spork'

Spork.prefork do
  ENV["RAILS_ENV"] ||= 'test'
  require File.expand_path("../../config/environment", __FILE__)
  require 'rspec/rails'

Dir[Rails.root.join("spec/support/**/*.rb")].each {|f| require f}

  RSpec.configure do |config|
    config.mock_with :rspec
    config.fixture_path = "#{::Rails.root}/spec/fixtures"
    config.use_transactional_fixtures = true

    # Needed for Spork
    ActiveSupport::Dependencies.clear
  end 

end

Spork.each_run do
  load "#{Rails.root}/config/routes.rb"
  Dir["#{Rails.root}/app/**/*.rb"].each { |f| load f } 
end

这是我的 users_spec.rb:

describe "Users" do

  describe "signup" do

    describe "failure" do

      it "should not make a new user" do
        lambda do
          visit signup_path
          fill_in "Name",         :with => ""
          fill_in "Email",        :with => ""
          fill_in "Password",     :with => ""
          fill_in "Confirmation", :with => ""
          click_button
          response.should render_template('users/new')
          response.should have_selector("div#error_explanation")
        end.should_not change(User, :count)
      end 
    end 


    describe "success" do

      it "should make a new user" do
        lambda do
          visit signup_path
          fill_in "Name",         :with => "Example User"
          fill_in "Email",        :with => "ryan@example.com"
          fill_in "Password",     :with => "foobar"
          fill_in "Confirmation", :with => "foobar"
          click_button
          response.should have_selector("div.flash.success",
                                        :content => "Welcome")
          response.should render_template('users/show')
        end.should change(User, :count).by(1)
      end 
    end 
  end 
end

有什么想法吗?谢谢。

有了 mpapis 的回答,我就可以正常工作了。这是我更新的 spec/requests/user_spec.rb 文件:

require 'spec_helper'
require 'database_cleaner'
DatabaseCleaner.strategy = :truncation

describe "Users" do

  describe "signup" do

    describe "failure" do

      it "should not make a new user" do
        lambda do
          visit signup_path
          fill_in "Name",         :with => ""
          fill_in "Email",        :with => ""
          fill_in "Password",     :with => ""
          fill_in "Confirmation", :with => ""
          click_button
          response.should render_template('users/new')
          response.should have_selector("div#error_explanation")
        end.should_not change(User, :count)
      end 
    end 


    describe "success" do

      it "should make a new user" do
        lambda do
          visit signup_path
          fill_in "Name",         :with => "Example User"
          fill_in "Email",        :with => "ryan@example.com"
          fill_in "Password",     :with => "foobar"
          fill_in "Confirmation", :with => "foobar"
          click_button
          response.should have_selector("div.flash.success",
                                        :content => "Welcome")
          response.should render_template('users/show')
        end.should change(User, :count).by(1)
        DatabaseCleaner.clean
      end 
    end 
  end 
end

【问题讨论】:

  • 您说您将代码添加到您的spec_helper 文件中?它应该在特定规范中,而不是 spec_helper。是不是打错字了?
  • @Andrew 是的错字,我编辑了它。感谢您注意到这一点。

标签: ruby-on-rails ruby rspec


【解决方案1】:

mpapis 的回答让它起作用了。

请务必将其包含在您的 GEMFILE 中,例如:

group :test do
    gem 'rspec', '2.5.0'
    gem 'webrat', '0.7.1'
    gem 'spork', '0.9.0.rc4'
    gem 'factory_girl_rails'
    gem 'database_cleaner'
end    

bundle install

【讨论】:

    【解决方案2】:

    就我而言,测试视图会使数据库处于不清楚状态,您应该尝试https://github.com/bmabey/database_cleaner 它用于黄瓜测试后的清理,但主页上提供了 Rspec 的示例。

    【讨论】:

    • 感谢您的帮助,我回家后会试一试,让您知道它是如何工作的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-27
    相关资源
    最近更新 更多