协作头脑风暴
brainstorming
在实现前澄清需求、探索设计选择,并形成清晰的开发方向。
ui5-best-practices-qunit【开发与工程】Use when the user asks to "write a QUnit test", "fix a failing QUnit test", "add a QUnit module", "modernize QUnit tests", "migrate from QUnit 1", or mentions QUnit-specific constructs such as assert.async, nextUIUpdate, Core.applyChanges, sinon sandbox, asyncTest, or QUnit.module. Covers coding standards for OpenUI5/SAPUI5 unit test files: const/let…
独立 GitHub 快照 · 自动分类 · 以原作者文档为准
| Trigger | Load |
|---|---|
| Writing a new QUnit test file or module from scratch | references/writing-new-tests.md |
| Modernizing, refactoring, or reviewing existing test code | references/modernizing-tests.md |
Migrating from QUnit 1 (globals: test, asyncTest, ok, stop, start) to QUnit 2 | references/modernizing-tests.md |
Any test touches nextUIUpdate, Core.applyChanges, assert.async, fake timers, or event-based async | references/async-patterns.md |
Load the reference before producing any output. Do not work from memory.
| Rule | Detail |
|---|---|
No var | Use const or let. One declaration per line - no comma chains. |
No .bind(this) | Use arrow functions for callbacks that do not need their own this. |
assert.expect(N) in every async test | Guards against silent passes when async callbacks never fire. Not required for sync tests. |
sinon.createSandbox() | sinon.sandbox.create() emits a runtime deprecation warning in Sinon 5+ - prefer sinon.createSandbox(). Alternatively use the QUnit-sinon bridge (this.stub(), this.spy(), this.mock(); this.clock only when sinon.config.useFakeTimers is truthy). Do not mix both approaches in the same module. |
| Descriptive test names | Sentence describing behavior. Never start with "it should". Unique within each module. |
beforeEach / afterEach in every module | Create all controls in beforeEach, destroy them in afterEach. No shared mutable state between tests. |
try/finally in helper-created controls | Helpers that create a control must destroy it in finally so it is cleaned up even when assertions throw. |
| No non-ASCII characters | No non-ASCII characters in comments, strings, or JSDoc. Use plain ASCII hyphens, not em dashes. UTF-8 is required, but non-ASCII in comments has historically caused encoding issues. |
| ESLint - 0 errors | Warnings for pre-existing patterns (max-nested-callbacks, no-use-before-define, valid-jsdoc) are acceptable. |
Use when authoring or reviewing a QUnit test file:
var - use const or let; one declaration per line (no comma chains).bind(this) - use arrow functions for callbacks that do not need their own thisassert.async() in simple cases - use async function + await new Promise(...)async test has assert.expect(N)sinon.sandbox.create() in new code - use sinon.createSandbox() or the bridge (this.stub(), this.spy(), this.mock()); this.clock only when fake timers are enabled"it should..." test titles - use descriptive sentencesQUnit.module has beforeEach / afterEach that create and destroy all controlsawait nextUIUpdate(this.clock) over Core.applyChanges(); only keep Core.applyChanges() when nextUIUpdate(clock) cannot handle the casetry/finally