- use-generateguid-for-unique-test-fixture-values.md: narrowed the collision rule to primary-key/unique-lookup fields - an ordinary descriptive field carries no uniqueness constraint, so a hardcoded or deterministic value there isn't the anti-pattern (the article and its al-testing-review.md worklist cue both said "primary-key or descriptive field"). Also corrected GenerateRandomCode: it opens its target table as a temporary RecordRef that starts and stays empty, so its repeat/until loop always exits after one iteration and never retries even within a single test run - the "non-colliding within a test run" claim was false. It's the rightmost N characters of GenerateGUID()'s sequential series, so a short field's value cycles (Code[1] repeats every 10 calls, Code[2] every 100). Verified against LibraryUtility.Codeunit.al in the BCApps reference clone. - item-ledger-entry-document-no-follows-last-shipping-no: both fixtures called FindSet() without consuming its optional Boolean, which raises a runtime error on an empty result set - the opposite of the article's own claimed "silently matches zero rows, no error" behavior. Wrapped in `if ... then;` per the existing guard-database-reads.good.al idiom. - al-data-modeling-review.md: widened both not-applicable scope clauses (intro and outcome) to include dimension wiring, posting- routine structure, and Item Ledger Entry document-number lookups - the leaf declared itself not-applicable outside setup/master/key/ numbering/block/audit surfaces despite having a targeted cue for this PR's own new article. - Converted this PR's 8 plain-backtick "See sample: `x.good.al`." references (across all 4 new articles) to the READ-convention markdown-link form required by Knowledge-Retrieval.ps1. Rebased onto upstream/main (one conflict in al-data-modeling-review.md intro wording, merged).
1.6 KiB
| bc-version | domain | keywords | technologies | countries | application-area | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
testing |
|
|
|
|
Verify field visibility and enabled state with TestPage.Visible()/.Enabled()
Description
A UI test codeunit does not need to inspect table or page properties indirectly to confirm a field is shown or enabled under given conditions. The TestPage object exposes a Visible() and an Enabled() function on each field, reflecting the page's actual rendered state, callable directly from a [Test] procedure. Enabled() and Editable() are distinct states — this article covers visibility/enabled state specifically; see use-testpage-editable-to-verify-field-editability.md for verifying whether a field can actually be changed.
Best Practice
Open the TestPage, navigate to the relevant record if needed, then assert against TestPageField.Visible() and TestPageField.Enabled() to verify the field's shown/enabled state, rather than checking an unrelated table/page property or skipping the check.
See sample: use-testpage-visible-enabled-to-verify-field-ui-state.good.al.
Anti Pattern
A test that opens the TestPage but never asserts against Visible()/Enabled() on the field in question — confirming only that the page opens, not that the field behaves as expected.
See sample: use-testpage-visible-enabled-to-verify-field-ui-state.bad.al.