Заметки о тестировании, программировании и прочий "поток сознания", который жалко писать "в стол"
суббота, 1 июля 2023 г.
Коротко ещё.
https://vk.com/wall101055118_15494
Модель. А то что не покрыто тестами - так вообще в "серой зоне". И может давать ЛЮБОЙ результат. Пока тесты на это не наткнуться.
Модель. А то что не покрыто тестами - так вообще в "серой зоне". И может давать ЛЮБОЙ результат. Пока тесты на это не наткнуться.
Снова с вами. Коротко.
Тестовое покрытие так вообще оказалось помогает программировать. Не тестировать. А именно программировать. Всегда можно написать некую "эмуляцию" того кода, который не понимаешь откуда взять. Но на котором тест падает. Всегда можно написать "заглушку". Типа "на время". И зачастую это "на время" годится "на годы". Главное - хорошее покрытие кода тестами.
пятница, 2 сентября 2022 г.
вторник, 2 июня 2020 г.
Перегруженный protected constructor. Bug or expected behavior?
По работе захотел воспользоваться паттерном фабричный метод, и спрятать конструктор за protected декларацию.
program ProtectedConstructor;
{$APPTYPE CONSOLE}
{$R *.res}
uses
System.SysUtils;
type
TBaseClass = class
protected
FData : string;
constructor Create(const AData: string); virtual;
public
class function FactoryMethod(const Adata: string): TBaseClass;
property Data : string read FData;
end;
type
TInheritor = class (TBaseClass)
protected
constructor Create(const AData: string); override;
end;
constructor TBaseClass.Create(const AData: string);
begin
Fdata := Adata;
Writeln('TBaseClass.Create');
end;
class function TBaseClass.FactoryMethod(const Adata: string): TBaseClass;
begin
Result := TInheritor.Create(Adata)
end;
constructor TInheritor.Create(const AData: string);
begin
inherited;
Writeln('TInheritor.Create');
end;
var
MyClass : TBaseClass;
begin
try
MyClass := TBaseClass.FactoryMethod('Test');
try
Writeln(MyClass.Data);
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
finally
MyClass.Free;
Readln;
end;
end.
Ожидаемое поведение:
Я же решил разнести классы по разным модулям. TBaseClass в одном, и TInheritor в другом.
program BugProtectedConstructor;
{$APPTYPE CONSOLE}
{$R *.res}
uses
System.SysUtils,
uBaseClass in 'uBaseClass.pas',
uInheritor in 'uInheritor.pas';
var
MyClass : TBaseClass;
begin
try
MyClass := TBaseClass.FactoryMethod('Test');
try
Writeln(MyClass.Data);
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
finally
MyClass.Free;
Readln;
end;
end.
unit uBaseClass;
interface
type
TBaseClass = class
protected
FData : string;
constructor Create(const AData: string); virtual;
public
class function FactoryMethod(const Adata: string): TBaseClass;
property Data : string read FData;
end;
implementation
uses
uInheritor;
constructor TBaseClass.Create(const AData: string);
begin
Fdata := Adata;
Writeln('TBaseClass.Create');
end;
class function TBaseClass.FactoryMethod(const Adata: string): TBaseClass;
begin
Result := TInheritor.Create(Adata)
end;
end.
unit uInheritor;
interface
uses
uBaseClass;
type
TInheritor = class (TBaseClass)
protected
constructor Create(const AData: string); override;
end;
implementation
{ TInheritorOne }
constructor TInheritor.Create(const AData: string);
begin
inherited;
Writeln('TInheritor.create');
end;
end.
На выходе:
То есть в перегруженный конструктор мы не попадаем.
И вот вопрос, это баг или фича?
Запостил в quality portal
https://quality.embarcadero.com/browse/RSP-29333
понедельник, 23 декабря 2019 г.
среда, 4 декабря 2019 г.
Роза живее всех живых
"Арифметика над множествами".
Self .Operations .Filter .IsPublic - получаем список всех public-методов.
https://www.facebook.com/photo.php?fbid=2877975158936740&set=a.2537801119620814&type=3&app=fbl
Подписаться на:
Сообщения (Atom)


