В разделе 6.2.4 Учебное пособие по Ruby on Rails 3 Майкл Хартл описывает предостережение о проверке уникальности адресов электронной почты: если два идентичных запроса совпадают по времени, запрос A может пройти проверку, затем B Пройдите валидацию, затем A сохраните, затем B сохраните, и вы получите две записи с одинаковым значением. Каждый был действителен на момент проверки.
Мой вопрос , а не о решении (наложите уникальное ограничение на базу данных, чтобы сохранение B не сработало). Речь идет о написании теста, чтобы доказать, что решение работает. Я пытался написать свой собственный, но все, что я придумал, только имитировало обычные, простые тесты уникальности.
Будучи совершенно новым для rspec, мой наивный подход заключался в том, чтобы просто написать сценарий:
it 'should reject duplicate email addresses with caveat' do
A = User.new( @attr )
A.should be_valid # always valid
B = User.new( @attr )
B.should be_valid # always valid, as expected
A.save.should == true # save always works fine
B.save.should == false # this is the problem case
# B.should_not be_valid # ...same results as "save.should"
end
но этот тест проходит / не проходит в тех же случаях, что и обычный тест на уникальность; B.save.should == false
проходит, когда мой код написан так, что обычный тест на уникальность проходит и не проходит, если обычный тест не проходит.
Итак, мой вопрос: «Как мне написать тест rspec, который проверит, что я решаю эту проблему?» Если ответ окажется «это сложно», есть ли другая платформа тестирования Rails, на которую я должен обратить внимание?