Я использую RSpec для тестирования моего приложения RoR и использую ActiveLDAP для внутреннего использования. Сейчас я пишу спецификации для контроллера, который создает новые объекты через ActiveLDAP, и поэтому я написал несколько строк, подобных этой, чтобы представить поведение при создании записи:
before(:each) do
@sample_attributes = {"a" => "b", "c" => "d"}
@cu = Cloud::User.new
@cu.stub(:save).and_return false
@cu.stub(:attributes=).with(@sample_attributes).and_return @sample_attributes
Cloud::User.stub(:new).and_return @cu
end
Цель этого состоит в том, чтобы дать возможность рассчитывать на модель @cu, чтобы гарантировать выполнение определенных команд для нее. Вот так:
it "should save the new cloud user" do
@cu.should_receive(:save).and_return false
post 'create', :cloud_user => @sample_attributes
end
it "should set the attributes of the new cloud user" do
@cu.should_receive(:attributes=).with(@sample_attributes).and_return @sample_attributes
post 'create', :cloud_user => @sample_attributes
end
Довольно просто, верно? Ну, вот в чем проблема. Первый успешен, но второй всегда выдает эту ошибку:
private method `new' called for #<Class:0x007f8bcad775c8>
Когда он запускает эту строку в контроллере:
@cloud_user = Cloud::User.new
Нет, это не частный метод. И ТОЧНАЯ ЖЕ ЛИНИИ прекрасно работает в первом тесте. Кроме того, это не является чем-то присущим индивидуальному тесту. Если я переверну порядок двух тестов, то проверка набора атрибутов будет успешной, а сохранение пользовательского теста завершится неудачно. В основном, это успешно выполняется в зависимости от того, кто запускается первым, и не в зависимости от того, кто запускается вторым.
ПОЧЕМУ?
У кого-нибудь есть идеи? Я должен думать, что это как-то связано с тем, как работает команда-заглушка с ActiveLDAP, но я не знаю. Кажется, так просто!