roblox-testing
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseWhen to Load
加载时机
Load when writing unit/integration tests, mocking Roblox services, setting up CI/CD with Lune, or refactoring code for testability via dependency injection. Hand off to for syntax, for type design, for architecture, for validation.
roblox-luau-coreroblox-luau-typesroblox-luau-patternsroblox-security在编写单元/集成测试、模拟Roblox服务、基于Lune搭建CI/CD流程,或通过依赖注入重构代码以提升可测试性时加载。语法相关内容请参考,类型设计参考,架构参考,验证相关参考。
roblox-luau-coreroblox-luau-typesroblox-luau-patternsroblox-securityQuick Reference
快速参考
TestEZ (BDD framework)
TestEZ(BDD框架)
- Install: in
[dev-dependencies] TestEZ = "roblox/testez@0.4.1"wally.toml - Files: , co-located with source
*.spec.luau - Blocks: →
describe→it/beforeEachafterEach - Assertions: ,
expect(x).to.equal(y),.to.be.near(n, ε).to.throw()
- 安装:在中添加
wally.toml[dev-dependencies] TestEZ = "roblox/testez@0.4.1" - 文件:,与源代码同目录存放
*.spec.luau - 代码块结构:→
describe→it/beforeEachafterEach - 断言:、
expect(x).to.equal(y)、.to.be.near(n, ε).to.throw()
Dependency Injection
依赖注入
luau
-- BAD: untestable outside Studio
local store = game:GetService("DataStoreService"):GetDataStore("PlayerData")
-- GOOD: inject dependency
local function saveData(player, data, dataStore)
dataStore:SetAsync("player_" .. player.UserId, data)
end
-- Module init pattern:
function Manager.init(dataStoreService)
_dss = dataStoreService or game:GetService("DataStoreService")
endluau
-- 不良示例:无法在Studio外测试
local store = game:GetService("DataStoreService"):GetDataStore("PlayerData")
-- 良好示例:注入依赖项
local function saveData(player, data, dataStore)
dataStore:SetAsync("player_" .. player.UserId, data)
end
-- 模块初始化模式:
function Manager.init(dataStoreService)
_dss = dataStoreService or game:GetService("DataStoreService")
endMocking Essentials
模拟基础
luau
-- MockDataStore: in-memory Get/Set/Update
local M = {}
function M.new() return setmetatable({_data={}}, {__index=M}) end
function M:GetAsync(k) return self._data[k] end
function M:SetAsync(k,v) self._data[k]=v end
function M:GetDataStore() return self end
-- MockRemoteEvent: OnServerEvent + FireServer
-- MockSignal: Connect/Fire with Connected flagluau
-- MockDataStore:内存版的Get/Set/Update操作
local M = {}
function M.new() return setmetatable({_data={}}, {__index=M}) end
function M:GetAsync(k) return self._data[k] end
function M:SetAsync(k,v) self._data[k]=v end
function M:GetDataStore() return self end
-- MockRemoteEvent:包含OnServerEvent + FireServer
-- MockSignal:包含Connect/Fire及Connected状态标记CI/CD with Lune
基于Lune的CI/CD
toml
undefinedtoml
undefinedaftman.toml
aftman.toml
[tools]
lune = "lune-org/lune@0.8.0"
Pipeline: `selene src/` → `stylua --check src/` → `luau-lsp analyze` → `lune run tests/run.luau`
```lua
-- tests/run.luau
local TestEZ = require("@testez")
local results = TestEZ.TestBootstrap:run({game:GetService("ReplicatedStorage")}, TestEZ.Reporters.TextReporter)
if results.failureCount > 0 then os.exit(1) end[tools]
lune = "lune-org/lune@0.8.0"
流水线流程:`selene src/` → `stylua --check src/` → `luau-lsp analyze` → `lune run tests/run.luau`
```lua
-- tests/run.luau
local TestEZ = require("@testez")
local results = TestEZ.TestBootstrap:run({game:GetService("ReplicatedStorage")}, TestEZ.Reporters.TextReporter)
if results.failureCount > 0 then os.exit(1) endTesting Priority
测试优先级
- DataStore save/load round-trips (prevents data loss)
- Monetization ProcessReceipt (idempotency)
- Core math (damage, buffs, economy)
- Server validation (remote exploits)
- DataStore保存/加载往返测试(防止数据丢失)
- 变现流程ProcessReceipt测试(幂等性)
- 核心计算逻辑测试(伤害、增益、经济系统)
- 服务器验证测试(远程漏洞防护)
Pitfalls
常见陷阱
- to reset state; never
beforeEachin logicgame:GetService() - Tests must be order-independent; CI needs mocks; commit Need more detail? Load
wally.lockfor the complete reference with code examples, API tables, and edge cases.references/full.md
- 使用重置状态;切勿在业务逻辑中直接调用
beforeEachgame:GetService() - 测试必须独立于执行顺序;CI环境需要使用模拟对象;提交文件 需要更多细节? 请查看
wally.lock获取包含代码示例、API表格及边界情况的完整参考文档。references/full.md