總結
。我試圖使用Gut為我在gdscript撰寫一個單元測驗,但在player上呼叫get_position()(一個KinematicBody2D)導致以下錯誤:
ERROR: get_global_transform: 條件"!is_inside_tree() "為真。回傳:get_transform()
在:scene/2D/canvas_item.cpp:467。
ERROR:body_test_motion。條件"!body->get_space() "為真。回傳的結果是:false
在:services/physics_2d/physics_2d_server_sw.cpp:1046。
ERROR:get_global_transform。條件"!is_inside_tree() "為真。回傳:get_transform()
在:scene/2D/canvas_item.cpp:467。
ERROR:body_test_ray_separation。條件"!body->get_space() "為真。回傳的結果是:false
在: servers/physics_2d/physics_2d_server_sw.cpp:1058.
期望值
我期望在_physics_process()之后,我能夠得到我的player的最新位置,但是它回傳Vector2(0, 0)。
資源
這是我第一次使用GDScript,所以我混合使用了以下的資源,試圖寫出這第一個測驗:
資源
。 <撰寫的內容失敗的解決方案
我想我可能需要讓player成為其他東西的子代,但我不確定如何在我的測驗中做到這一點。
我試著在Gut issues中搜索如何在測驗中使用add_child(),但我沒有找到答案。
我還試著讓player成為Area2D的一個子節點,但這似乎也不起作用:
var player := Player.new(input)
var area := Area2D.new()
area.add_child(player)
代碼
這是從命令列中呼叫gut時導致錯誤的代碼:
test/unit/actors/test_player.gd
extends "res://addons/gut/test.gd"
func test_can_create_player() -> void:_span>
var input = MockInput.new()
var player := Player.new(input)
assert_not_null(player)
func test_can_move_player_up() -> void:
var input = MockInput.new()
input.press("ui_up")
var player := Player.new(input)
simulate(player, 1, .1)
assert_eq(player.get_position(), Vector2(200, 0)
test/mock_input.gd
class_name MockInput。
var _pressed: Dictionary = {}。
func press(key: String) -> void:
_pressed[key] = true
func release(key: String) -> void:
_pressed[key] = false
func is_action_pressed(key: String) -> bool:
if _pressed.have(key):
return _pressed.get(key)
returnfalse
entities/actors/player.gd
extends KinematicBody2D
class_name Player
export var speed: int = 200.
var _input: Object = Input
var _velocity: Vector2 = Vector2()
func _init(input: Object = Input)。
_input = input
func _physics_process(_delta: float) -> void:
_velocity = Vector2()
如果_input.is_action_pressed("ui_right")。
_velocity.x = 1: _velocity.x = 1.
如果_input.is_action_pressed("ui_left")。
_velocity.x -= 1: _velocity.x -= 1.
如果_input.is_action_pressed("ui_down")。
_velocity.y = 1: _velocity.y = 1.
如果_input.is_action_pressed("ui_up")。
_velocity.y -= 1: _velocity.y -= 1.
_velocity = _velocity.normalized() * speed
_velocity = move_and_slide(_velocity)
uj5u.com熱心網友回復:
這個錯誤是告訴你!is_inside_tree()。問題不僅在于節點沒有一個父節點。問題是它不在一個SceneTree里面。
你可以創建你自己的SceneTree的實體。你甚至可以擴展它。例如,這將作業:
var node := KinematicBody2D.new()
var tree := SceneTree.new()
tree.get_root().add_child(node)
屈服(tree, "idle_frame")
print(node.get_global_transform())
現在,關于Gut...你的測驗將在一個SceneTree內運行。因此,你可以將你想測驗的節點添加為子節點。只要記得做適當的拆分(洗掉節點)。因為Gut不會為你這樣做,而且如果子節點從一個測驗到另一個測驗中徘徊,那么它們就不再是單元了。
補充:你可以使用add_child_autofree來添加一個子節點,并且在測驗結束后立即排隊釋放它。
答案的其余部分是我對 Gut 如何運行測驗以確認它們在 SceneTree 內運行的介紹。
檔案 反過來, 這里 將它作為子程式添加到 之后 萬歲! 你的測驗將在一個自定義的 uj5u.com熱心網友回復: 我找到了適合我的目的的東西(我有點惱火,因為我第一次錯過了這個)。 正如我所懷疑的, 在 完整的單元測驗如下:
標籤: 下一篇:安卓11存盤訪問和Java檔案庫
gut_cmdln.gd實際上是一個擴展的SceneTree。它將加載gut.gd(這里),并將其作為一個節點添加到自身(這里)。gut.gd負責運行測驗,這由_test_the_scripts處理。我想讓你看的是這個: var test_script = the_script.get_new()
var script_result = null
_setup_script(test_script)
the_script是一個TestScript物件。get_new呼叫將回傳一個實體。而_setup_script...func _setup_script(test_script):
test_script.gut = self
test_script.set_logger(_lgr)
add_child(test_script)
_test_script_objects.append(test_script)
gud.gd)。_test_the_scripts將進入一個回圈(這里)并呼叫_run_test或者_run_parameterized_test(它呼叫_run_test)來實際運行測驗。而_run_test將在實體上使用call來運行測驗方法(有額外步驟)。SceneTree中運行。player需要成為另一個Node的子節點。test/unit/actors/test_player.gd中,在player變數被定義后,它可以被添加為測驗本身的一個子節點,使用:self.add_child_autofree(player)
func test_can_move_player_up() -> void:
var input = MockInput.new()
input.press("ui_up"/span>)
var player := Player.new(input)
self.add_child_autofree(player)
simulate(player, 1, 0)
assert_eq(player.get_position). round(), Vector2(0, -30)
