Rails 3.2: уникальность Failed Assertion: правда

Все,

У меня проблемы с тестированием модели, у меня есть простая таблица клиентов, в которой используются следующие поля: имя: строка, местоположение: строка, полное_имя: строка, актив: логическое значение. Я использую поле full_name как скрытое поле, содержащее следующее «#{имя} #{местоположение}», и проверяю запись на уникальность в поле full_name.

Тест «клиент недействителен без уникального полного имени» — это тест, с которым у меня возникла проблема, я пытаюсь проверить вставку дублирующей записи. Если я удалю челку (!) перед утверждением !customer.save, тест будет пройден. это действует так, как будто приборы не загружаются в таблицу до запуска теста, я запускаю rake test:units. Я попытался запустить сервер в режиме разработки и вставил две записи с использованием строительных лесов, а вторая вставка завершилась неудачно и сообщила об ошибке «Полное имя уже занято», что является ожидаемым поведением.

кто-нибудь может подсказать, где я напортачил с тестом!

заранее спасибо

Возврат


Модель:

class Customer < ActiveRecord::Base
  attr_accessible :active, :full_name, :location, :name

  validates :active, :location, :name, presence: true
  validates :full_name, uniqueness: true              # case I am trying to test

  before_validation :build_full_name

  def build_full_name
    self.full_name = "#{name} #{location}"
  end

end

Тестовое приспособление customers.yml

one:
  name: MyString
  location: MyString
  full_name: MyString
  active: false

two:
  name: MyString
  location: MyString
  full_name: MyString
  active: false

general:
  name: 'Whoever'
  location: 'Any Where'
  full_name: ''
  active: true

Помощники по тестовым модулям customer_test.rb

require 'test_helper'

class CustomerTest < ActiveSupport::TestCase
  # test "the truth" do
  #   assert true 
  # end

  fixtures :customers

  # Test fields have to be present
  test "customer fields must not be empty" do
    customer = Customer.new
    assert customer.invalid?
    assert customer.errors[:name].any?
    assert customer.errors[:location].any?
    assert_equal " ", customer.full_name     # This is processed by a helper function in the model
    assert customer.errors[:active].any?
  end

  # Test full_name field is unique
  test "customer is not valid without a unique full_name" do
    customer = Customer.new(
    name: customers(:general).name,
    location: customers(:general).location,
    full_name: customers(:general).full_name,
    active: customers(:general).active
    )

    assert !customer.save   # this is the line that fails
    assert_equal "has already been taken", customer.errors[:full_name].join(', ')
  end

end

person user1368339    schedule 01.05.2012    source источник


Ответы (1)


Я нашел проблему в фикстуре customers.yml:

Я предполагал, что фикстура будет обрабатываться через модель и что хелпер build_full_name будет вызываться до того, как данные будут вставлены в тестовую базу данных. Похоже, это не так.

Я изменил приспособление следующим образом, и это решило проблему:

one:
 name: MyString
 location: MyString
 full_name: MyString
 active: false

two:
 name: MyString2         # changed for consistency, was not the problem
 location: MyString2
 full_name: MyString2
 active: false

general:
 name: 'Whoever'
 location: 'Any Where'
 full_name: 'Whoever Any Where'  #Here was the problem
 active: true
person user1368339    schedule 04.05.2012