2013-08-21 2 views
0

Я в настоящее время тестирует этот класс в Sinatra/DataMapperrspec/datamapper - как мне сказать rspec ожидать ошибку?

class Score 
include DataMapper::Resource 

property :score, Integer 

property :created_at, DateTime, :default => DateTime.now, :lazy => [:show] 
property :updated_at, DateTime, :default => DateTime.now, :lazy => [:show] 

belongs_to :pageant, :key => true 
belongs_to :candidate, :key => true 
belongs_to :category, :key => true 
belongs_to :judge, :key => true 

end 

с этим RSpec тест

it 'that can be inserted by a judge if a pageant is active' do 
     score_count = Score.all.length 
     post '/score', @correct_score_data 
     Score.all.length.should eq score_count+1 
    end 

    it 'cannot be duplicated if it has been sent' do 
     score_count = Score.all.length 
     post '/score', @correct_score_data 
     Score.all.length.should eq score_count 
    end 

в основном то, что должно произойти в том, что судья может отправить только оценку для определенной категории + кандидат + конкурс, один раз, после чего я должен отрицать следующие баллы. Теперь, когда я запускаю это, я получаю IntegrityError (которого я ожидаю). Как сообщить rspec, что я «ожидаю увидеть эту ошибку»? Вы, ребята, можете критиковать мой код, я все еще учусь все это вместе

+1

Это будет полезно: http://stackoverflow.com/questions/1722749/how-to-use-rspecs-should-raise-with-any-kind- of-exception – cortex

ответ

0

Использование expect{}.to raise_error: https://www.relishapp.com/rspec/rspec-expectations/v/2-6/docs/built-in-matchers/raise-error-matcher

Я не в полной мере понять свои функции (это похоже на ваше состояние приложения протекает между двумя испытаниями), но что-то вроде этого ...

it 'cannot be duplicated if it has been sent' do 
    score_count = Score.all.length 
    expect { post '/score', @correct_score_data }.to raise_error(IntegrityError) 
end 
+0

Пробовал это, и да, это работает сейчас. Что вы имеете в виду, что состояние приложения протекает между двумя тестами? –

+0

Ну, две спецификации, которые вы опубликовали, выглядят так, как будто они делают то же самое, но ожидают разные результаты. Если у вас нет дополнительной информации, которую вы не отправляли, я предположил, что вы ожидаете, что один тест будет запущен, преуспеть, а затем следующий тест для запуска и нажмите приложение в «плохое» состояние. Две спецификации не должны требовать друг от друга работы. Если это не тот случай, то я просто слишком много думал! –

+0

Ах да, что должно было случиться, это то, что отправить один, он работает, отправить то же самое, он не работает ... думаю, мне нужно больше читать –