rspec模拟没有在belongs_to关联上调用

时间:2013-04-25 12:16:21

标签: ruby-on-rails rspec mocking

我正在尝试使用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)

它给出了错误说:用户未被调用。

1 个答案:

答案 0 :(得分:1)

在规范的第二行,返回@player而不是@gplayer。如果未定义@gplayer,则您的find_by_id将在您的规范中返回nil,因此if条件将在它到达remove_player之前短路。