Minitest在连续两次运行中给出不同的结果

时间:2012-06-02 18:25:17

标签: ruby-on-rails ruby testing minitest

我和Minitest一直在玩,并且发现了我似乎无法找到解释的行为

我有一个非常简单的模型测试文件,如下所示:

require 'minitest_helper'

describe User do

  before do
    @user = User.new(name: "Example User", email: "user@example.com",
                     password: "foobards", password_confirmation: "foobards")
  end

  describe "with admin attribute set to 'true'" do
    before { @user.toggle!(:admin) }

    it { @user.admin.must_equal true }
  end 
end

当我在'rake db:test:prepare'之后第一次运行此代码时,测试通过

当我连续第二次运行它时,它会给我一个错误:

  

test_0001_anonymous 0:00:00.132
  错误           SQLite3 :: ConstraintException:列电子邮件不是唯一的:INSERT INTO“users”(“admin”,“created_at”,“email”,“name”,   “password_digest”,“updated_at”)VALUES(?,?,?,?,?,?)

如果我拿出

,似乎不会出现这个错误
before { @user.toggle!(:admin) }

我的minitest_helper.rb如下:

ENV["RAILS_ENV"] = "test"
require File.expand_path("../../config/environment", __FILE__)
require "minitest/autorun"
require "capybara/rails"
require "active_support/testing/setup_and_teardown"

class IntegrationTest < MiniTest::Spec
  include Rails.application.routes.url_helpers
  include Capybara::DSL
  register_spec_type(/integration$/, self)
end

class HelperTest < MiniTest::Spec
  include ActiveSupport::Testing::SetupAndTeardown
  include ActionView::TestCase::Behavior
  register_spec_type(/Helper$/, self)
end

Turn.config.format = :outline

我似乎无法理解这是一个错误还是(更有可能)我错过了什么。 有可能比我更了解的人请解释一下吗?

2 个答案:

答案 0 :(得分:1)

toggle!方法保存记录。因此,当您第二次运行测试时,数据库中已有一条记录,其中包含电子邮件“user@example.com”。并且保证电子邮件地址唯一性的验证失败。

尝试使用toggle(没有爆炸)。

答案 1 :(得分:1)

您需要在事务中包装每个测试(并将其回滚以便永远不保存更改)或清除测试之间的所有表。如果没有从数据库中留下的垃圾将干扰后续的测试运行

database_cleaner gem是这样做的一种方式,支持一系列ORM的多种策略(事务,截断等)