* Added ExpectException call, to avoid creating a new method

git-svn-id: trunk@30321 -
This commit is contained in:
michael 2015-03-24 18:42:25 +00:00
parent 1768e35daa
commit 9523fc3d33
2 changed files with 190 additions and 12 deletions

View File

@ -182,11 +182,17 @@ type
procedure EndTestSuite(ATestSuite: TTestSuite);
end;
{ TTestCase }
TTestCase = class(TAssert)
private
FName: string;
FTestSuiteName: string;
FEnableIgnores: boolean;
FExpectedExceptionFailMessage : String;
FExpectedException : TClass;
FExpectedExceptionMessage: String;
FExpectedExceptionContext: Integer;
protected
function CreateResult: TTestResult; virtual;
procedure SetUp; virtual;
@ -203,11 +209,17 @@ type
constructor Create; virtual;
constructor CreateWith(const ATestName: string; const ATestSuiteName: string); virtual;
constructor CreateWithName(const AName: string); virtual;
procedure ExpectException(AExceptionClass: TClass; AExceptionMessage: string=''; AExceptionHelpContext: Integer=0);
procedure ExpectException(const Msg: String; AExceptionClass: TClass; AExceptionMessage: string=''; AExceptionHelpContext: Integer=0);
function CountTestCases: integer; override;
function CreateResultAndRun: TTestResult; virtual;
procedure Run(AResult: TTestResult); override;
function AsString: string;
property TestSuiteName: string read GetTestSuiteName write SetTestSuiteName;
Property ExpectedExceptionFailMessage : String Read FExpectedExceptionFailMessage;
Property ExpectedException : TClass Read FExpectedException;
Property ExpectedExceptionMessage : String Read FExpectedExceptionMessage;
Property ExpectedExceptionContext: Integer Read FExpectedExceptionContext;
published
property TestName: string read GetTestName write SetTestName;
end;
@ -311,6 +323,8 @@ Resourcestring
SCompareNotEqual = ' expected: not equal to <%s> but was: <%s>';
SExpectedNotSame = 'expected not same';
SExceptionCompare = 'Exception %s expected but %s was raised';
SExceptionMessageCompare = 'Exception raised but exception property Message differs: ';
SExceptionHelpContextCompare = 'Exception raised but exception property HelpContext differs: ';
SMethodNotFound = 'Method <%s> not found';
SNoValidInheritance = ' does not inherit from TTestCase';
SNoValidTests = 'No valid tests found in ';
@ -569,7 +583,7 @@ end;
class procedure TAssert.AssertEquals(const AMessage: string; Expected, Actual: string);
begin
AssertTrue(AMessage + ComparisonMsg(Expected, Actual), AnsiCompareStr(Expected, Actual) = 0);
AssertTrue(ComparisonMsg(AMessage ,Expected, Actual), AnsiCompareStr(Expected, Actual) = 0);
end;
@ -581,7 +595,7 @@ end;
{$IFDEF UNICODE}
class procedure TAssert.AssertEquals(const AMessage: string; Expected, Actual: UnicodeString);
begin
AssertTrue(AMessage + ComparisonMsg(Expected, Actual), (Expected=Actual));
AssertTrue(ComparisonMsg(AMessage,Expected, Actual), (Expected=Actual));
end;
@ -599,7 +613,7 @@ end;
class procedure TAssert.AssertEquals(const AMessage: string; Expected, Actual: integer);
begin
AssertTrue(AMessage + ComparisonMsg(IntToStr(Expected), IntToStr(Actual)), Expected = Actual);
AssertTrue(ComparisonMsg(AMessage,IntToStr(Expected), IntToStr(Actual)), Expected = Actual);
end;
@ -611,7 +625,7 @@ end;
class procedure TAssert.AssertEquals(const AMessage: string; Expected, Actual: int64);
begin
AssertTrue(AMessage + ComparisonMsg(IntToStr(Expected), IntToStr(Actual)), Expected = Actual);
AssertTrue(ComparisonMsg(AMessage,IntToStr(Expected), IntToStr(Actual)), Expected = Actual);
end;
@ -623,7 +637,7 @@ end;
class procedure TAssert.AssertEquals(const AMessage: string; Expected, Actual: currency);
begin
AssertTrue(AMessage + ComparisonMsg(FloatToStr(Expected), FloatToStr(Actual)), Expected = Actual);
AssertTrue(ComparisonMsg(AMessage,FloatToStr(Expected), FloatToStr(Actual)), Expected = Actual);
end;
@ -635,7 +649,7 @@ end;
class procedure TAssert.AssertEquals(const AMessage: string; Expected, Actual, Delta: double);
begin
AssertTrue(AMessage + ComparisonMsg(FloatToStr(Expected),FloatToStr(Actual)),
AssertTrue(ComparisonMsg(AMessage,FloatToStr(Expected),FloatToStr(Actual)),
(Abs(Expected - Actual) <= Delta));
end;
@ -654,7 +668,7 @@ end;
class procedure TAssert.AssertEquals(const AMessage: string; Expected, Actual: boolean);
begin
AssertTrue(AMessage + ComparisonMsg(BoolToStr(Expected, true), BoolToStr(Actual, true)), Expected = Actual);
AssertTrue(ComparisonMsg(AMessage,BoolToStr(Expected, true), BoolToStr(Actual, true)), Expected = Actual);
end;
@ -666,7 +680,7 @@ end;
class procedure TAssert.AssertEquals(const AMessage: string; Expected, Actual: char);
begin
AssertTrue(AMessage + ComparisonMsg(Expected, Actual), Expected = Actual);
AssertTrue(ComparisonMsg(AMessage,Expected, Actual), Expected = Actual);
end;
@ -687,7 +701,7 @@ class procedure TAssert.AssertEquals(const AMessage: string; Expected, Actual: T
end;
begin
AssertTrue(AMessage + ComparisonMsg(GetN(Expected), GetN(Actual)), Expected = Actual);
AssertTrue(ComparisonMsg(AMessage,GetN(Expected), GetN(Actual)), Expected = Actual);
end;
@ -699,7 +713,7 @@ end;
class procedure TAssert.AssertSame(const AMessage: string; Expected, Actual: TObject);
begin
AssertTrue(AMessage + ComparisonMsg(IntToStr(PtrInt(Expected)), IntToStr(PtrInt(Actual))),
AssertTrue(ComparisonMsg(AMessage,IntToStr(PtrInt(Expected)), IntToStr(PtrInt(Actual))),
Expected = Actual);
end;
@ -712,7 +726,7 @@ end;
class procedure TAssert.AssertSame(const AMessage: string; Expected, Actual: Pointer);
begin
AssertTrue(AMessage + ComparisonMsg(IntToStr(PtrInt(Expected)), IntToStr(PtrInt(Actual))),
AssertTrue(ComparisonMsg(AMessage,IntToStr(PtrInt(Expected)), IntToStr(PtrInt(Actual))),
Expected = Actual);
end;
@ -966,6 +980,8 @@ var
m: TMethod;
RunMethod: TRunMethod;
pMethod : Pointer;
FailMessage : String;
begin
AssertNotNull('name of the test not assigned', FName);
pMethod := Self.MethodAddress(FName);
@ -974,7 +990,33 @@ begin
m.Code := pMethod;
m.Data := self;
RunMethod := TRunMethod(m);
RunMethod;
ExpectException('',Nil,'',0);
try
FailMessage:='';
RunMethod;
if (FExpectedException<>Nil) then
FailMessage:=Format(SExceptionCompare, [FExpectedException.ClassName, SNoException])
except
On E : Exception do
begin
if FExpectedException=Nil then
Raise;
If not (E is FExpectedException) then
FailMessage:=Format(SExceptionCompare, [FExpectedException.ClassName, E.ClassName]);
if (FExpectedExceptionMessage<>'') then
if (FExpectedExceptionMessage<>E.Message) then
FailMessage:=Format(SExceptionmessageCompare+SCompare, [FExpectedExceptionMessage,E.Message]);
if (FExpectedExceptionContext<>0) then
if (FExpectedExceptionContext<>E.HelpContext) then
FailMessage:=Format(SExceptionHelpContextCompare+SCompare, [IntToStr(FExpectedExceptionContext),IntToStr(E.HelpContext)])
end;
end;
if (FailMessage<>'') then
begin
if (FExpectedExceptionFailMessage<>'') then
FailMessage:=' : '+FailMessage;
Fail(FExpectedExceptionFailMessage+FailMessage);
end;
end
else
begin
@ -1125,6 +1167,21 @@ begin
end;
end;
procedure TTestCase.ExpectException(const Msg: String;
AExceptionClass: TClass; AExceptionMessage: string = '';
AExceptionHelpContext: Integer =0 );
begin
FExpectedExceptionFailMessage:=Msg;
FExpectedException:=AExceptionClass;
FExpectedExceptionMessage:=AExceptionMessage;
FExpectedExceptionContext:=AExceptionHelpContext;
end;
procedure TTestCase.ExpectException(AExceptionClass: TClass;
AExceptionMessage: string = ''; AExceptionHelpContext: Integer = 0);
begin
ExpectException('',AExceptionClass,AExceptionMessage,AExceptionHelpContext);
end;
procedure TTestSuite.Run(AResult: TTestResult);
var

View File

@ -23,6 +23,8 @@ uses
type
{ TAssertTest }
TAssertTest = class(TTestCase)
published
procedure TestFail;
@ -37,11 +39,25 @@ type
procedure TestAssertTrue;
procedure TestAssertFalse;
procedure TestAssertNotSame;
procedure TestExpectExceptionOK;
procedure TestExpectExceptionNoException;
procedure TestExpectExceptionWrongExceptionClass;
procedure TestExpectExceptionWrongExceptionMessage;
procedure TestExpectExceptionWrongExceptionContext;
end;
EMyException = Class(Exception);
{ TMyTest }
TMyTest = class(TTestCase)
published
procedure RaiseIgnoreTest;
procedure TestExpectException;
procedure TestExpectExceptionNone;
procedure TestExpectExceptionWrongClass;
procedure TestExpectExceptionWrongMessage;
procedure TestExpectExceptionWrongHelpContext;
end;
TTestIgnore = class(TTestCase)
@ -233,12 +249,117 @@ begin
Fail('Error: Objects are the same!');
end;
procedure TAssertTest.TestExpectExceptionOK;
var
t: TMyTest;
res: TTestResult;
begin
t := TMyTest.CreateWithName('TestExpectException');
res := t.CreateResultAndRun;
assertEquals('no test was run', 1, res.RunTests);
assertEquals('no Ignored Test present', 0, res.NumberOfIgnoredTests);
assertEquals('no failed Test present', 0, res.NumberOfFailures);
t.Free;
res.Free;
end;
procedure TAssertTest.TestExpectExceptionNoException;
var
t: TMyTest;
res: TTestResult;
begin
t := TMyTest.CreateWithName('TestExpectExceptionNone');
res := t.CreateResultAndRun;
assertEquals('no test was run', 1, res.RunTests);
assertEquals('no Ignored Test present', 0, res.NumberOfIgnoredTests);
assertEquals('no failed Test present', 1, res.NumberOfFailures);
assertEquals('Correct error message','Error message : Exception EMyException expected but no exception was raised',TTestFailure(res.Failures[0]).ExceptionMessage);
t.Free;
res.Free;
end;
procedure TAssertTest.TestExpectExceptionWrongExceptionClass;
var
t: TMyTest;
res: TTestResult;
begin
t := TMyTest.CreateWithName('TestExpectExceptionWrongClass');
res := t.CreateResultAndRun;
assertEquals('no test was run', 1, res.RunTests);
assertEquals('no Ignored Test present', 0, res.NumberOfIgnoredTests);
assertEquals('no failed Test present', 1, res.NumberOfFailures);
assertEquals('Correct error message','Error message : Exception EMyException expected but Exception was raised',TTestFailure(res.Failures[0]).ExceptionMessage);
t.Free;
res.Free;
end;
procedure TAssertTest.TestExpectExceptionWrongExceptionMessage;
var
t: TMyTest;
res: TTestResult;
begin
t := TMyTest.CreateWithName('TestExpectExceptionWrongMessage');
res := t.CreateResultAndRun;
assertEquals('no test was run', 1, res.RunTests);
assertEquals('no Ignored Test present', 0, res.NumberOfIgnoredTests);
assertEquals('no failed Test present', 1, res.NumberOfFailures);
assertEquals('Correct error message','Error message : Exception raised but exception property Message differs: expected: <A message> but was: <A wrong message>',TTestFailure(res.Failures[0]).ExceptionMessage);
t.Free;
res.Free;
end;
procedure TAssertTest.TestExpectExceptionWrongExceptionContext;
var
t: TMyTest;
res: TTestResult;
begin
t := TMyTest.CreateWithName('TestExpectExceptionWrongHelpContext');
res := t.CreateResultAndRun;
assertEquals('no test was run', 1, res.RunTests);
assertEquals('no Ignored Test present', 0, res.NumberOfIgnoredTests);
assertEquals('no failed Test present', 1, res.NumberOfFailures);
assertEquals('Correct error message','Error message : Exception raised but exception property HelpContext differs: expected: <123> but was: <124>',TTestFailure(res.Failures[0]).ExceptionMessage);
t.Free;
res.Free;
end;
procedure TMyTest.RaiseIgnoreTest;
begin
Ignore('This is an ignored test');
AssertEquals('the compiler can count', 3, 2);
end;
procedure TMyTest.TestExpectException;
begin
ExpectException('Error message',EMyException,'A message',123);
Raise EMyException.CreateHelp('A message',123);
end;
procedure TMyTest.TestExpectExceptionNone;
begin
ExpectException('Error message',EMyException,'A message',123);
end;
procedure TMyTest.TestExpectExceptionWrongClass;
begin
ExpectException('Error message',EMyException,'A message',123);
Raise Exception.CreateHelp('A message',123);
end;
procedure TMyTest.TestExpectExceptionWrongMessage;
begin
ExpectException('Error message',EMyException,'A message',123);
Raise EMyException.CreateHelp('A wrong message',123);
end;
procedure TMyTest.TestExpectExceptionWrongHelpContext;
begin
ExpectException('Error message',EMyException,'A message',123);
Raise EMyException.CreateHelp('A message',124);
end;
procedure TTestIgnore.TestIgnoreResult;
var
t: TMyTest;