Рубин, Rspec, и урожай окурок - PullRequest
       10

Рубин, Rspec, и урожай окурок

0 голосов
/ 12 сентября 2018

Допустим, у меня есть такой класс в Ruby:

class Test
  def execute
    count = 0
    40.times do
      search_for_names(count) do |name, last_name|
        yield name, last_name
      end
      count += 1
    end
  end

  def search_for_names(count)
    friend = get_friend_name(count)
    yield friend.name, friend.last_name
  end
end

Мой вопрос: как мне сделать, чтобы заглушить мой метод search_for_names, чтобы получить 40 разных имен в моем тесте Rspec?(Я установил фейкер).Я пытался:

let(:friends) do
described_class.new
end

allow(friends).to receive(:search_for_names).and_yield(
      Faker::Name.name,
      Faker::Name.last_name
)

 it 'finds multiple friends' do
    friends.execute do |name, last_name|
      puts name
      expect(name).not_to be_empty
      expect(last_name).not_to be_empty
    end
  end

Но он печатает всегда одно и то же имя х40.

И ...:

allow(friends).to receive(:search_for_names).and_yield(
      Faker::Name.name,
      Faker::Name.last_name
    ).and_yield(
      Faker::Name.name,
      Faker::Name.last_name
    )

Но он печатает два разных имени х40 (80имена).Но я хотел бы иметь только 40 раз другое имя.Является ли это возможным ?Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 12 сентября 2018

Другой вариант - использовать синтаксис блока receive, например,

allow(friends).to receive(:search_for_names) do |_,&block| 
  block.call(Faker::Name.name, Faker::Name.last_name)
end

вместо неявного yielding для блока, вместо этого мы фиксируем блок (&block) и затем явно вызываем его с аргументами Faker.

Это исключает необходимость использования внутреннего цикла 40 раз allow ances, так как каждый раз, когда вызывается search_for_names, этот блок будет выполняться снова.

Пример Repl

0 голосов
/ 12 сентября 2018

Проблема .and_yield(Faker::Name.name, Faker::Name.last_name) выполняется один раз .Ваша функция уже готова принять параметр, используйте его:

40.times do |i|
  allow(friends).to receive(:search_for_names).with(i).and_yield(
    "#{Faker::Name.name}_#{i}",
    "#{Faker::Name.last_name}_#{i}"
  )
end

Sidenote: вместо введения локальной переменной count, простоиспользуйте то, что Integer#times передает блоку:

def execute
  40.times do |count|
    search_for_names(count) do |name, last_name|
      yield name, last_name
    end
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...