我正在尝试对我的代码运行一些测试,但我遇到了一个问题。对于一个非常简单的代码行,我得到一个奇怪的错误消息。此测试是为了确保我的服务器可以从我的一个客户端接收信息。
没有这一行,测试和文件运行良好:
client_1.@socket.puts("This gives an error.")
包含该位代码会出现此错误:
macowner:WAR3 macowner$ ruby ServerTests1.rb
ServerTests1.rb:160: syntax error, unexpected tIVAR, expecting '('
client_1.@socket.puts("Output for Server to receive.") #Error
^
非常感谢帮助。我经常得到这个错误,但我不知道这意味着什么(即使搜索它)。
enter code here
require 'minitest/autorun'
require 'socket'
require_relative 'WarGame_Class.rb'
require_relative 'ModifiedPlayer_Class.rb'
require_relative 'DeckClass.rb'
class WarServer
def initialize(host, port)
@socket_server = TCPServer.new(host, port)
@players = [Player.new, Player.new]
@deck = CardDeck.new
@deck.deal_cards(@players[0].cards, @players[1].cards)
game = WarGame.new
@clients = {} # keys are sockets, values are players
end
def client_keys(key)
@clients.keys[key] # this should work
end
def input #input reader function
@input
end
def close
@socket_server.close
end
def capture_input ##input client to get what they wrote
@input = @clients.keys[0].read_nonblock(1000) # arbitrary max number of bytes
end
def accept_client
#Hash here to link client to player? (or game?)
client = @socket_server.accept
@clients[client] = @players[@clients.size]
# puts "clients key 0: #{@clients.keys[0]}"
puts
# puts "clients values: #{@clients.values}"
if @clients.size == 2
start_game#####################!!!! Starts game if two clients can put client messages in start game
end
end
def start_game ##############!!!
@clients.keys[0].puts "Welcome to War. Please press enter to play your card"
@clients.keys[1].puts "Welcome to War. Please press enter to play your card"
end
end
class MockWarClient
def initialize
@socket = TCPSocket.new('localhost', 2012)
end
def output
@output
end
def input
@input
end
def capture_output #need to add (socket)? How else read from specific socket?
@output = @socket.read_nonblock(1000) # arbitrary max number of bytes
rescue
@output = "capture_output error."
end
def write_input
@input = @war_server.client_keys.write_nonblock(1000)
end
end
class WarServerTest < MiniTest::Unit::TestCase
def setup #This would be like our INITIALIZE Function
#anything is available through out all tests (i.e., instance vars)
@war_server = WarServer.new('localhost', 2012)
end
def teardown
@war_server.close
end
def test_server_capture_output_from_client
client_1 = MockWarClient.new
@war_server.accept_client
client_2 = MockWarClient.new
@war_server.accept_client
client_1.@socket.puts("Output for Server to receive.") #Line I need to fix
#SOCKETforSERVER
#clien_n.SOCKETforSERVER.puts''
#Replace puts with write_nonblock, perhaps
end
end
答案 0 :(得分:0)
如果您尝试访问@socket
实例变量,那么您只需要MockWarClient
中的其他访问者方法:
def socket
@socket
end
和说client_1.socket.puts(...)
来使用它。您还可以使用attr_reader
来简化操作:
class MockWarClient
attr_reader :socket, :input, :output
def initialize
@socket = TCPSocket.new('localhost', 2012)
end
def capture_output #need to add (socket)? How else read from specific socket?
@output = @socket.read_nonblock(1000) # arbitrary max number of bytes
rescue
@output = "capture_output error."
end
def write_input
@input = @war_server.client_keys.write_nonblock(1000)
end
end
这将为您创建三种访问方法。
答案 1 :(得分:-1)
在@socket
尝试时,无法以通常的方式调用名为client_1.@socket
的方法。该方法名称非常不寻常,因为它与实例变量混淆,并且您实际上有这样的方法是值得怀疑的,但是如果你这样做,那么调用这种方法的方法是:
client_1.send(:@socket)