Я прочитал rspec docs и обыскал ряд других мест, но я имею трудное время схватив разницу между Rspec-х let
и let!
Проблемы с дифференциацией Rspec 'let' vs 'let!'
Я читал, что let
не инициализирован, пока это не нужно, и что его значение кэшируется только на пример. Я также читал, что let!
заставляет переменную в непосредственном существовании и вызывает вызов для каждого примера. Думаю, с тех пор как я новичок, мне трудно понять, как это относится к следующим примерам. Почему :m1
необходимо установить с let!
, чтобы утверждать, что m1.content
присутствует на странице, но :user
может быть установлен с let
, чтобы утверждать, что страница содержит text: user.name
?
subject { page }
describe "profile page" do
let(:user) { FactoryGirl.create(:user) }
let!(:m1) { FactoryGirl.create(:micropost, user: user, content: "Foo") }
let!(:m2) { FactoryGirl.create(:micropost, user: user, content: "Bar") }
before { visit user_path(user) }
it { should have_selector('h1', text: user.name) }
it { should have_selector('title', text: user.name) }
describe "microposts" do
it { should have_content(m1.content) }
it { should have_content(m2.content) }
it { should have_content(user.microposts.count) }
end
end
describe "after saving the user" do
before { click_button submit }
let(:user) { User.find_by_email('[email protected]') }
it { should have_selector('title', text: user.name) }
it { should have_success_message('Welcome') }
it { should have_link('Sign out') }
end
Это имеет смысл. Итак, отправляя объект (m1), сообщения (содержимого) недостаточно, используя let, потому что m1 еще не инициализирован? – KMcA
Ну, это не причина, почему тест потерпел неудачу. Причина, по которой тест терпит неудачу, заключается в том, что вы уже «посетили страницу» перед созданием микросообщений, и поэтому страница не содержала контента. Я мог бы обновить свой ответ, чтобы быть более понятным, если у вас все еще есть сомнения? –
Хорошо, снова посмотрев на мой вопрос («после сохранения пользователя»), как второй тест сможет проверить «user.name»? – KMcA