Я недавно добавил Devise в свое первое приложение на Rails3, и у меня возникли некоторые проблемы с тестами контроллера.
Я тестирую класс контроллера User, который является той же моделью, которую использует Devise. Итак, в начале моей спецификации у меня есть это:
before(:each) do
sign_in @user = Factory.create(:user)
end
Теперь я могу пройти тестирование без использования насмешек или заглушек:
describe "GET edit" do
it "assigns the requested user as @user" do
user = Factory(:user)
get :edit, :id => user.id
assigns(:user).should eql(user)
end
end
Но в образовательных целях я хотел бы знать, как заставить его работать с насмешками и заглушками, обычно это было бы совершенно прямо, но кажется, что Devise вызывает User.find
перед действием контроллера и делает тест неудачным. .
describe "GET edit" do
it "assigns the requested user as @user" do
user = Factory(:user)
User.expects(:find).with(:first, :conditions => {:id => 37}).returns(user)
get :edit, :id => '37'
assigns(:user).should be(user)
end
end
Кроме того, добавив twice
к ожиданию, это также не удастся, потому что первый вызов, который нужно найти, отличается от того, для которого я устанавливаю ожидание.
Любое понимание будет оценено.