Используя Rails 3, Rspec 2, gem factory_girl_rails, у меня есть контроллер со следующим кодом:
def remove_player
@player = User.find(params[:id])
current_team.users.delete(@player)
current_team.games.each do |g|
ug = GamesUser.where(:game_id => g.id, :user_id => @player.id)
ug.each {|x| x.destroy}
end
redirect_to(team_path(current_team), :notice => 'Player was successfully removed from this team')
end
Он отлично работает и делает то, что мне нужно.Однако я не могу понять, что я делаю неправильно в своих тестах, которые выглядят так:
describe "Remove player" do
before do
@team = Factory(:team)
@player = Factory(:user)
@game = Factory(:game)
controller.stub!(:current_team).and_return(@team)
end
it "should remove player from team" do
@team.users << @player
@team.users.should have(1).users
post :remove_player, :id => @player.id
@team.users.should have(0).users
end
it "should remove games from player schedule" do
Factory(:games_user, :user_id => @player.id)
@player.should have(1).games
post :remove_player, :id => @player.id
@player.should have(0).games
end
end
Первый тест пройден.Однако второй нет.Я новичок в rspec и тестировании в целом, так что не стесняйтесь указывать на любые недостатки, которые вы видите - я не буду обижаться.команда (Team has_many Users) и удалите любые игры из расписания этого игрока (Game habtm Users через GamesUser).Да, а "current_team" - это вспомогательный метод, который выбирает команду на основе переменной сеанса.