Лучший способ утверждать, что все user.name в массиве пользователя начинаются с префикса, используя rspec? - PullRequest
3 голосов
/ 06 ноября 2011

Вот что у меня есть. И такая работа.

it "should filter by name" do
  users = users.search(:name => "s")
  users.each {|u| 
    u.name.should be_starts_with("s")
  } 
end

Однако сообщение об ошибке, возвращаемое rspec, действительно плохое ...

ожидается, что sets_with? ("S") вернет true, получил false

Есть ли способ получить более точное сообщение, показывающее неисправный элемент или хотя бы его индекс?

Ответы [ 5 ]

20 голосов
/ 07 ноября 2011

В таком бинарном тесте я бы создал двух пользователей, один из которых начинается с s, а другой - без. Затем я бы проверил, что был возвращен только ожидаемый элемент.

как

set up a user(:name => "Sam") and user(:name => "Fred")

filtered_users.map(&:name).should =~ ["Sam"]

В случае сбоя вы увидите что-то вроде

expected ["Sam"]
got ["Fred", "Sam"]

Это гораздо более ясно о том, что вы делаете

2 голосов
/ 06 ноября 2011

Причина, по которой вы получаете только ожидаемое значение true, но полученное значение false , заключается в том, что методы start_with возвращают значение true или false, а не фактическое значение.

Я не уверен, что это лучший способ, но вы можете вывести его самостоятельно.

  users.each {|u| 
    p u.name if !u.name.starts_with?("s")
    u.name.should be_starts_with("s")
  } 
1 голос
/ 07 ноября 2011

Вот как я использовал несколько раз в таких случаях:

describe 'user' do
  before :each do
    @users = users.search(:name => "s")
  end

  @users.each do |u| 
    it "should filter user with name '#{u.name}'" do
      u.name.should be_starts_with("s")
    end
  end

end

Вы не сможете указать имя пользователя в описании примера.

0 голосов
/ 07 ноября 2011

Это должно дать вам гораздо лучшие сообщения об ошибках

it "should filter by name" do
  users = users.search(:name => "s")
  users.each do |u|
    u.name.should match /^s/
  end
end

Я согласен с Кори, что вызов "be_starts_with" грубыйОжидания RSpec предназначены для плавного прочтения предложения.Не всем нужно использовать «быть».

0 голосов
/ 06 ноября 2011

Я нашел здесь интересное расширение для сопоставителей из Rspec, касающееся каждого: http://xtargets.com/2011/08/12/rspec-meta-expectations-over-collections

Так что я вставил этот помощник в мой spec_helper

RSpec::Matchers.define :each do |meta|
  match do |actual|
    actual.each_with_index do |i, j|
    @elem = j
    i.should meta
  end
end

failure_message_for_should do |actual|
  "at[#{@elem}] #{meta.failure_message_for_should}"
end

, который позволяет мне писать

users.should each satisfy {|u| u.name.should be_starts_with 's'}

, а затем появляется сообщение об ошибке:

в [1] ожидается #User для удовлетворения блока

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

Есть мысли?Я не рубин, только начинаю с рельсов.Было бы неплохо получить больше информации от

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...