Как бы вы тестировали наблюдателей с помощью rSpec в приложении Ruby on Rails?

У вас такая же проблема. Прочитайте этот . Отключите антивирусное программное обеспечение (mcafee). Et voila

Подтверждено антивирусным журналом:

Blocked by Access Protection rule d:\mingw64\x86_64-w64-mingw32\bin\ld.exe d:\workspace\cpp\bar\foo.exe User-defined Rules:ctx3 Action blocked : Create

37
задан Nicolai Reuschling 27 August 2015 в 20:10
поделиться

2 ответа

Вы на правильном пути, но я столкнулся со многими расстраивающими неожиданными системными ошибками при использовании rSpec, наблюдателями и фиктивными объектами. Когда я - спецификация, тестирующая мою модель, я не хочу должным быть обрабатывать поведение наблюдателя в своих ожиданиях сообщения.

В Вашем примере, нет действительно хорошего пути к спецификации "set_status" на модели без ведома того, что наблюдатель собирается сделать к нему.

Поэтому мне нравится использовать "Никакие Чрезмерно любопытные люди" плагин. , Учитывая Ваш код выше и использование Никакого плагина Чрезмерно любопытных людей, я был бы спецификация модель как это:

describe Person do 
  it "should set status correctly" do 
    @p = Person.new(:status => "foo")
    @p.set_status("bar")
    @p.save
    @p.status.should eql("bar")
  end
end

Вы можете спецификация Ваш типовой кодекс, не имея необходимость волноваться, что существует наблюдатель там, который собирается войти и ударить Ваше значение. Вы были бы спецификация что отдельно в person_observer_spec как это:

describe PersonObserver do
  it "should clobber the status field" do 
    @p = mock_model(Person, :status => "foo")
    @obs = PersonObserver.instance
    @p.should_receive(:set_status).with("aha!")
    @obs.after_save
  end
end 

, Если Вы ДЕЙСТВИТЕЛЬНО ДЕЙСТВИТЕЛЬНО хотите протестировать двойной класс Модели и Наблюдателя, можно сделать это как это:

describe Person do 
  it "should register a status change with the person observer turned on" do
    Person.with_observers(:person_observer) do
      lambda { @p = Person.new; @p.save }.should change(@p, :status).to("aha!)
    end
  end
end

99% времени, я быть бы тест спецификации с выключенными наблюдателями. Это просто легче тот путь.

35
ответ дан awendt 27 August 2015 в 20:10
поделиться
  • 1
    это io.sockets.broadcast.emit не корректно, broadcast потребности знать, который снабдил сокетом для исключения/игнорирования из испускания, таким образом, у Вас есть два варианта: 1) от глобального io-> io.sockets.in(namespace).socket(socketID).broadcast.emit("hello") или 2) от сокета-> socket.broadcast.emit("hello") – Claudiu Hojda 25 October 2013 в 16:13

Правовая оговорка: я на самом деле никогда не делал этого на месте производства, но похоже, что разумный путь состоял бы в том, чтобы использовать фиктивные объекты, should_receive и друзья, и вызвать методы на наблюдателя непосредственно

, Учитывая следующую модель и наблюдателя:

class Person < ActiveRecord::Base
  def set_status( new_status )
    # do whatever
  end
end

class PersonObserver < ActiveRecord::Observer
  def after_save(person)
    person.set_status("aha!")
  end
end

я записал бы спецификацию как это (я выполнил ее, и она передает)

describe PersonObserver do
  before :each do
    @person = stub_model(Person)
    @observer = PersonObserver.instance
  end

  it "should invoke after_save on the observed object" do
    @person.should_receive(:set_status).with("aha!")
    @observer.after_save(@person)
  end
end
15
ответ дан Orion Edwards 27 August 2015 в 20:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: