mirror of
https://github.com/microsoft/BCQuality.git
synced 2026-10-05 14:46:55 +01:00
- al-testing-review.md: the generic ExpectedError cue's asserterror Assert.IsTrue/IsFalse exclusion was unconditional, but the specialized rule it deferred to only claims the pure-inversion shape. A test expecting the guarded Boolean-returning call itself to raise fell through both routes. Narrowed the exclusion to the same inversion-only condition the specialized cue already uses. - asserterror-needs-expectederror-and-code.md: the rollback-sentinel exception (a trailing asserterror Error(...) used purely to force a fixture rollback, not to verify a specific failure) previously lived only in skill routing prose. Encoded it directly in the article's Anti Pattern section so every consumer of the knowledge base sees it, not just this one skill. - commit-shared-test-fixture-inside-lazy-initialize.good.al/.bad.al: replaced hand-rolled Item.Init()/Insert(true) with LibraryInventory.CreateItem, so the canonical fixture doesn't itself trigger use-library-codeunits-for-test-fixtures. - table-relation-test-exclude-known-invalid-relations-via-event.good.al/ .bad.al: declared minimal "Sample Setup"/"Sample Header" tables inline instead of referencing undefined symbols, matching this repo's own convention that every fixture is self-contained.
73 lines
2 KiB
AL
73 lines
2 KiB
AL
codeunit 50142 "Sample Test Library"
|
|
{
|
|
Subtype = Test;
|
|
|
|
var
|
|
LibraryInventory: Codeunit "Library - Inventory";
|
|
Initialized: Boolean;
|
|
SharedItemNo: Code[20];
|
|
RollBackMsg: Label 'Revert back the tables to their original state.';
|
|
|
|
local procedure Initialize()
|
|
begin
|
|
if Initialized then
|
|
exit;
|
|
|
|
CreateSharedFixtureData();
|
|
// BUG: no Commit() here. The fixture below is still inside this
|
|
// test method's own transaction.
|
|
Initialized := true;
|
|
end;
|
|
|
|
local procedure CreateSharedFixtureData()
|
|
var
|
|
Item: Record Item;
|
|
begin
|
|
LibraryInventory.CreateItem(Item);
|
|
SharedItemNo := Item."No.";
|
|
end;
|
|
|
|
[Test]
|
|
procedure FirstTestUsesSharedFixture()
|
|
var
|
|
Item: Record Item;
|
|
begin
|
|
Initialize();
|
|
|
|
Item.Get(SharedItemNo);
|
|
Item.Description := 'Scratch change this test makes and does not need to keep.';
|
|
Item.Modify();
|
|
|
|
asserterror Error(RollBackMsg);
|
|
// The deliberate rollback above also erases the never-committed
|
|
// fixture from CreateSharedFixtureData(). Initialized still reads
|
|
// true on the next test, but the row it points at is gone.
|
|
end;
|
|
|
|
[Test]
|
|
procedure SecondTestStillFindsSharedFixture()
|
|
var
|
|
Item: Record Item;
|
|
begin
|
|
Initialize();
|
|
|
|
// Fails here: Initialize() saw Initialized = true and returned
|
|
// immediately, so it never recreated the fixture - and the first
|
|
// test's rollback took the original row with it.
|
|
Item.Get(SharedItemNo);
|
|
end;
|
|
}
|
|
|
|
codeunit 50143 "Sample Test Runner"
|
|
{
|
|
// Codeunit isolation alone does not save this fixture: TestIsolation
|
|
// only controls whether committed changes survive between methods, and
|
|
// this fixture was never committed in the first place.
|
|
Subtype = TestRunner;
|
|
TestIsolation = Codeunit;
|
|
|
|
trigger OnRun()
|
|
begin
|
|
Codeunit.Run(Codeunit::"Sample Test Library");
|
|
end;
|
|
}
|