1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160
|
//----------------------------------------------------------------------------
Type
PostMessageCommand = record
author: string;
text: string;
end;
function BuildPostMessageCommand(author, text: string) : PostMessageCommand;
Type
TMessage = class(TPersistent)
private
FID: String;
FAuthor: String;
FMessageText : String;
FPublishedAt: TDateTime;
procedure SetID(id: String);
procedure SetAuthor(author: String);
procedure SetMessageText(messgeText: String);
procedure SetPublishedAt(publishedAt: TDateTime);
protected
public
constructor Create(id, messageText, author : String; publishedAt: TDateTime);
property ID: String read FID write SetID;
property Author: String read FAuthor write SetAuthor;
property MessageText: String read FMessageTex write SetMessageText;
property PublishedAt: TDateTime read FPublishedAt write SetPubliedAt;
end;
//----------------------------------------------------------------------------
Type
IDateProvider = interface
function getNow(): DateTime;
end;
TAbstractDateProvider = Abstract Class(TInterfacedObject, IDateProvider)
public
function getNow(): DateTime; abstract;
end;
//----------------------------------------------------------------------------
//----------------------------------------------------------------------------
Type
TStubDateProvider = class(TAbstractDateProvider)
private
FNow: DateTime;
public
constructor Create(now: TDateTime);
function getNow(): DateTime;
end;
//----------------------------------------------------------------------------
TMessageBuilder = class
private
public
function WithId(Id: string): TMessageBuilder;
function AuthoredBy(author: string): TMessageBuilder;
function WithText(text: string): TMessageBuilder;
function PublishedAt(publishedAt: TDateTime): TMessageBuilder;
function Build: TMessage;
end;
//----------------------------------------------------------------------------
Type
MessagingFixture = class(TObject)
private
FDep1 : IDep;
FDep2 : IDep2;
protected
public
constructor (dependance1 : IDep1; dependance2:IDep2, dateProvider: IDateProvider)
procedure givenDateIs(dateStr: string);
procedure whenUserPostAMessage(message: PostMessageCommand);
procedure thenMessageShouldBe(expectedMessage : TMessage);
end;
//===============================================
uses fpcunit;
interface
type
TFeatureMessagingBaseTestCase = class(TTestCase)
protected
FFixture : TMessagingFixuture;
procedure Setup; override;
public
// ..
end;
type
TRule1_TestCase_1 = class(TFeatureMessagingBaseTestCase)
protected
procedure RunTest; override;
end;
//...
implementation
procedure TRule1_TestCase_1.RunTest;
var messageBuilder : TMessageBuilder;
begin
messageBuilder = TMessageBuilder.create();
//Arrange (GIVEN)
FFixture.givenDateIs(StrToDateTime("2023 06 21 22:28"));
// Act (WHEN)
FFixture.whenUserPostAMessage(BuildPostMessageCommand("Alice", "lorem picsum..."));
// Assert (THEN)
FFixture.thenMessageShouldBe(messageBuilder
.WithId("msg-1")
.AuthoredBy("Alice")
.WithText("lorem picsum...")
.PublishedAt(StrToDateTime("2023 06 21 22:28"))
.Build()
);
end;
//....
initialization
const cFeatureTestCase = "Feature_Messaging.";
const cRule_1 = "RULE_A_message_can_contain_a_maximum_of_280_characters.";
const cRule_1_Test_1 = "Alice_can_post_a_message_on_her timeline";
const cRule_1_Test_2 = "Alice_cannot_post_a_message_with_more_than_280_characters";
const cRule_2 = "RULE_A_message_cannot_be_empty.";
const cRule_2_Test_1 = "Alice_cannot_post_an_empty_message";
const cRule_2_Test_2 = "Alice_cannot_pos_a_message_with_only whitespaces";
RegisterTest(cFeatureTestCase + cRule_1 , TRule1_TestCase_1.CreateWithName(cRule_1_Test_1);
RegisterTest(cFeatureTestCase + cRule_1 , TRule1_TestCase_1.CreateWithName(cRule_1_Test_2);
RegisterTest(cFeatureTestCase + cRule_2 , TRule2_TestCase_1.CreateWithName(cRule_2_Test_1);
RegisterTest(cFeatureTestCase + cRule_2 , TRule2_TestCase_2.CreateWithName(cRule_2_Test_2);
end. |
Partager