根据我的测试,client_1应该是一个客户端类,我已经习惯了,看看我是否可以输出并放置它。我需要在我的客户端类中使用@output变量是STILL NIL,但我在客户端类中使用capture_output方法分配它。
@war_server.client_keys(0).puts("Hello Frodo") #works
temp_holder = client_1.capture_output #store output from server to temp holder
puts "Here is the captured input from client_1! : #{temp_holder}"#works
puts @client_1.output #DOES NOT WORK. But it should because I assin it in my class and use a reader definition
这是我的课程和测试的代码。谢谢!
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
#can output @war_server.client_keys, though, if I take out the argument to pass in.
#puts "Test_Server_output @client keys #{@war_server.client_keys(player)}" #cient_1?
puts "Test_Server_output @client keys 0 #{@war_server.client_keys(0)}"
puts "Test_Server_output @client keys 1 #{@war_server.client_keys(1)}"
@war_server.client_keys(0).puts("Hello Frodo")
temp_holder = client_1.capture_output
puts "Here is the captured input from client_1! : #{temp_holder}"
#puts @war_server.input
puts @client_1.output
end
end
答案 0 :(得分:1)
client_1
是一个局部变量,与@client_1
不同。我没有在此代码中看到您指定@client_1
的任何位置。除非有一些您不共享的代码,否则@client_1
将评估为nil
。
答案 1 :(得分:0)
@client_1
是实例变量,它是类实例上的变量,并且在对象存在的持续时间内存在。为了给实例变量赋值,必须通过预先使用@
添加变量名来表示它。
相反,client_1
是本地变量,它在单个方法或块中仅存在 。在您的代码段中,您已为client_1
本地变量指定了值,但未为@client_1
实例变量指定了值{{1直到被分配。