Railstutorial.org Проверка наличия тестов присутствия - PullRequest
2 голосов
/ 14 сентября 2011

Я работал над учебными пособиями на railstutorial.org , и я был немного озадачен авторским кодом для раздела - 6.2.1 Проверка наличия.

В пользовательской модели учебник добавляет validates :name, :presence => true. Достаточно просто.

Когда автор решает написать тест rspec, он делает то, что мне показалось немного странным.

describe User do

 before(:each) do
   @attr = { :name => "Example User", :email => "user@example.com" }
 end
 .
 .
 .
 it  "should require a name" do
  no_name_user = User.new(@attr.merge(:name => ""))
  no_name_user.should_not be_valid
 end

end

Зачем пытаться объединить пустую строку с @attr, если можно избавиться от оператора: each block и просто написать:

it "should require a name" do
  no_name_user = User.new(:name => "", :email => "user@example.com")
  no_name_user.should_not be_valid
end

Я знаю, что автор использует переменную @attr и для проверки наличия адреса электронной почты, что является одним из признаков того, почему он использовал инструкцию block - для меня более разумно следовать структуре цитата второго блока. Тем не менее, у меня есть ощущение, что я что-то упускаю здесь.

Еще одно объяснение, которое пришло мне в голову, заключается в том, что это помогает использовать структуру @attr, когда нужно ввести много ключей, в отличие от этого довольно упрощенного случая только имени и адреса электронной почты.

У кого-нибудь есть вход?

Ответы [ 2 ]

1 голос
/ 15 сентября 2011

Смысл в том, чтобы в тесте был только код, соответствующий тестовому случаю.Единственный релевантный атрибут при тестировании, что пользователь недействителен без имени, является атрибутом имени.Этот тест не должен знать ничего об атрибуте email.

Допустим, вы добавили проверку на наличие нового поля - вам придется обновлять каждый тест, в котором вы создаете пользователя без этого поля.С хешем attr в верхней части вы просто вставляете туда новое поле, и все ваши тесты в порядке.

Создание объектов для тестирования является достаточно распространенной проблемой, так как существует множество решений и множествообсуждение о том, какой путь лучше.Я бы посоветовал вам заглянуть на фабрики.Machinist и FactoryGirl - две альтернативы, которые отлично работают с Rails.

1 голос
/ 14 сентября 2011

Так что есть одна стандартная карта атрибутов, которую можно использовать во всех тестах. Когда тест требует, чтобы значение не было , оно удаляется.

Лично я не был уверен, что это того стоило, потому что это как-то запутывает вещи (как вы обнаружили), но это так.

...