Size: a a a

2020 April 03

VV

Vadim Venediktov in RubyRush
Алексей
почему?))
Вкратце: потому что с ними возни потом много, по сути, моки и стабы — следы реализации в тесте, теряется концепция "черной коробки". Поменял функционал, надо менять и тест.
источник

A7

Amigo 777 in RubyRush
Vadim Venediktov
Наша самая успешная выпускница (тим лид в AirBnB) — девушка. Се ля ви. И она за такие слова "типа женщины — влюбчивый, верный, творческий, мужчины — простота, логика" вам бы сейчас предъявила очень серьезно.
Она наверное среди мужиков выросла ))
источник

VV

Vadim Venediktov in RubyRush
Александр
почему? если я юнит пишу?
источник

А

Алексей in RubyRush
с такими сексистскими наклонностями вам точно не работать за океаном)))))
источник

M

Michael in RubyRush
прекращаем флуд
источник

А

Александр in RubyRush
Vadim Venediktov
Вкратце: потому что с ними возни потом много, по сути, моки и стабы — следы реализации в тесте, теряется концепция "черной коробки". Поменял функционал, надо менять и тест.
Ну смотри, допустим я пишу юнит тест для класса:
class Test
  def initialize(ar_obj)
      @x = ar_obj
  end
  def do_something
      @x.get_something
  end
end

Я буду мокать ar_obj И это наоборот мне позволит абстрагироваться от Active Record и сделать юниты стабильнее. Разве нет?
источник

VV

Vadim Venediktov in RubyRush
Александр
Ну смотри, допустим я пишу юнит тест для класса:
class Test
  def initialize(ar_obj)
      @x = ar_obj
  end
  def do_something
      @x.get_something
  end
end

Я буду мокать ar_obj И это наоборот мне позволит абстрагироваться от Active Record и сделать юниты стабильнее. Разве нет?
И как будет выглядеть тест?
источник

M

Michael in RubyRush
Александр
Ну смотри, допустим я пишу юнит тест для класса:
class Test
  def initialize(ar_obj)
      @x = ar_obj
  end
  def do_something
      @x.get_something
  end
end

Я буду мокать ar_obj И это наоборот мне позволит абстрагироваться от Active Record и сделать юниты стабильнее. Разве нет?
здесь у вас конструктор - часть публичного интерфейса - вы ar_obj не мокаете строго говоря, а просто передаете нужный для тестирования класса объект
источник

А

Александр in RubyRush
Vadim Venediktov
И как будет выглядеть тест?
subject { Test.new(ar_obj_mock) }
let(:ar_obj_mock) { double(get_something: :expected_result) } типа такого
источник

VV

Vadim Venediktov in RubyRush
Ну вот представьте теперь, что решили доставать те же данные, используя другой метод AR:

def do_something
 @x.get_something_else
end
источник

VV

Vadim Venediktov in RubyRush
Например, было с find_by(...), а стало с where(...).first
источник

А

Александр in RubyRush
Можно на ты, а то мне не удобно ) Я тоже на вы перейду :)
источник

VV

Vadim Venediktov in RubyRush
Можно, но это не точно :)
источник

А

Александр in RubyRush
Vadim Venediktov
Например, было с find_by(...), а стало с where(...).first
мой тест повалится и я пойду его переписывать, разве это плохо?
источник

VV

Vadim Venediktov in RubyRush
Vadim Venediktov
Например, было с find_by(...), а стало с where(...).first
И тебе придется переписывать тест, он по сути тестирует не возвращаемое значение метода, а то, что метод дернул нужный метод у объекта
источник

VV

Vadim Venediktov in RubyRush
Александр
мой тест повалится и я пойду его переписывать, разве это плохо?
ну эээ именно про это я и говорю, что вы поменяли реализацию (при этом на выходе может быть тот же самый р-т), а тест повалился
источник

VV

Vadim Venediktov in RubyRush
терябется концепция "черного ящика" (тестируем метод, не зная, как он устроен)
источник

А

Алексей in RubyRush
источник

VV

Vadim Venediktov in RubyRush
Тесты в т.ч. нужны, чтобы рефакторить проще было. Поправил реализацию метода, прогнал тесты, если прошли — всё ок. А тут получается, каждый раз надо будет править и тесты тоже. Хотя функционал может и не поменяться.
источник

VV

Vadim Venediktov in RubyRush
Но я не настаиваю, типа "откажитесь от моков совсем"
источник