我写了一个测试,以防止pawn向后移动。
test 'pawn back move is invalid' do
pawn = @game.pawns.first
pawn.moved = true
refute pawn.valid_move?(pawn.x_coord, (pawn.y_coord - 1))
pawn.moved = true
refute pawn.valid_move?(pawn.x_coord, (pawn.y_coord - 2))
end
这是我的典当模型所拥有的。
class Pawn < Piece
def valid_move?(x_destination, y_destination)
x_dist = (x_coord - x_destination).abs
y_dist = (y_coord - y_destination).abs
# if self.moved
# y_dist == 1 && x_dist == 0
# else
# (y_dist == 1 || y_dist == 2) && x_dist == 0
# end
while Game.where(:color => 'white') do
if self.moved
y_dist == -1 && x_dist == 0
else
(y_dist == -1 || y_dist == -2) && x_dist == 0
end
end
end
end
它的负面原因是因为从x-coord(0..7)和y-coord(0..7)设置了电路板......
所以hash中的那个会做得最好并且让我失败,但是我写的新代码完全抛弃了。我有游戏控制器和Pieces控制器。我不太确定应该打哪一个。
以下是我在终端中收到的错误消息。
1) Error:
PieceTest#test_pawn_back_move_is_invalid:
NoMethodError: undefined method `where' for Pieces:Module
app/models/pieces/pawn.rb:14:in `valid_move?'
test/models/piece_test.rb:118:in `block in <class:PieceTest>'
2) Error:
PieceTest#test_pawn_move_is_invalid:
NoMethodError: undefined method `where' for Pieces:Module
app/models/pieces/pawn.rb:14:in `valid_move?'
test/models/piece_test.rb:110:in `block in <class:PieceTest>'
3) Error:
PieceTest#test_pawn_move_is_valid:
NoMethodError: undefined method `where' for Pieces:Module
app/models/pieces/pawn.rb:14:in `valid_move?'
test/models/piece_test.rb:103:in `block in <class:PieceTest>'
4) Error:
PiecesControllerTest#test_should_move_piece:
NoMethodError: undefined method `valid_move?' for nil:NilClass
app/controllers/pieces_controller.rb:13:in `update'
test/controllers/pieces_controller_test.rb:8:in `block in <class:PiecesControllerTest>'
5) Error:
PiecesControllerTest#test_should_not_move_piece:
NoMethodError: undefined method `valid_move?' for nil:NilClass
app/controllers/pieces_controller.rb:13:in `update'
test/controllers/pieces_controller_test.rb:20:in `block in <class:PiecesControllerTest>'
40 tests, 70 assertions, 0 failures, 5 errors, 0 skips
Coverage report generated for MiniTest to /vagrant/src/chess/coverage. 123 / 133 LOC (92.48%) covered.
由于颜色原因,我最初打电话给我的Pieces控制器。
class PiecesController < ApplicationController
def create
end
def destroy
end
def update
@piece = Piece.where(:id => params[:id]).first
x_dest = params[:x_coord].to_i
y_dest = params[:y_coord].to_i
if @piece.valid_move?(x_dest, y_dest)
@piece.move_to(x_dest, y_dest)
render :json => :success
else
render :text => 'invalid', :status => :unprocessable_entity
end
end
private
def piece_params
params.require(:piece).permit(:color, :x_coord, :y_coord)
end
端
这是游戏控制器。 class GamesController&lt; ApplicationController的 before_action:authenticate_user!,:only =&gt; [:create,:update,:show]
def index
@games = Game.all
end
def new
@game = Game.new
end
def show
@game = Game.where(:id => params[:id]).first
render :text => 'That game does not exist.', :status => :not_found if @game.blank?
end
def create
@game = Game.create(:white_user_id => current_user.id)
redirect_to game_path(@game)
end
def update
@game = Game.find(params[:id])
if @game.white_user_id == current_user.id
flash[:alert] = "You can't play against yourself!"
redirect_to games_path
else
@game.update_attributes(:black_user_id => current_user.id)
redirect_to game_path(@game)
end
end
private
def games_params
params.require(:game).permit(:black_user_id, :white_user_id)
end
end
但我切换到游戏控制器进行测试......我很失落,任何帮助都会受到赞赏。 :)