0

我正在尝试使用 RSpec 在 Rails 中测试我的控制器,但它没有调用我制作的模拟之一,我不知道为什么。

我的模型有一个用户类,一个游戏类,一个玩家类,分别属于一个用户和一个游戏。

我正在尝试测试这样的东西

player = Player.find_by_id(params[:id])
if player != nil && player.user == current_user && player.game.remove_player?(player)
  redirect_to games_url

但我似乎无法模拟 remove_player?正确。我正在做的几乎是这样的:

@player = double("player")
Player.should_receive(:find_by_id).with(mock_player_id.to_s).and_return { @gplayer }
@player.stub(:user).and_return(@current_user)
fakeGame = double("game")
@player.stub(:game).and_return(fakeGame)
fakeGame.should_receive(:remove_player?).with(@player).and_return(true)

我收到错误消息说 remove_player? 从未被调用。知道我做错了什么吗?我不能确定它是否到达了 player.user ==curent_user,但它正在调用 find_by_id 并且根本没有抱怨它,所以我想它必须到达用户检查。

编辑:@current_user 确实等于 current_user

另外,我尝试将第 3 行替换为

fakeUser = double("user")
@player.should_receive(:user).and_return(@current_user)

它给了我错误消息:未调用用户。

4

1 回答 1

1

In the second line of your spec, return @player instead of @gplayer. If @gplayer isn't defined, your find_by_id will return nil in your spec, so your if condition will short circuit before it gets to remove_player.

于 2013-04-25T14:39:33.507 回答