В этом примере показано, как создать пользовательское ограничение, которое определяет, имеет ли данное значение тот же размер как ожидаемое значение.
В файле в вашей текущей папке создайте класс под названием HasSameSizeAs
путем получения из matlab.unittest.constraints.Constraint
класс. Конструктор класса принимает значение с ожидаемым размером, который сравнивается с фактическим размером. Это значение хранится в ValueWithExpectedSize
свойство. Поскольку этому рекомендуют тот Constraint
реализации быть неизменяемыми, установите свойство SetAccess
припишите immutable
.
classdef HasSameSizeAs < matlab.unittest.constraints.Constraint properties(SetAccess = immutable) ValueWithExpectedSize end methods function constraint = HasSameSizeAs(value) constraint.ValueWithExpectedSize = value; end end end
В methods
блокируйтесь с private
доступ, задайте вспомогательный метод sizeMatchesExpected
это определяет, имеют ли фактические и ожидаемые значения тот же размер. Этот метод вызывается другими ограничительными методами.
methods(Access = private) function bool = sizeMatchesExpected(constraint,actual) bool = isequal(size(actual),size(constraint.ValueWithExpectedSize)); end end
Классы, которые выводят из matlab.unittest.constraints.Constraint
класс должен заменить satisfiedBy
метод. Этот метод должен содержать логику сравнения и возвратить логическое значение.
В methods
блокируйте, реализуйте satisfiedBy
путем вызова вспомогательного метода. Если фактический размер и ожидаемый размер равны, метод возвращает true
.
methods function bool = satisfiedBy(constraint,actual) bool = constraint.sizeMatchesExpected(actual); end end
Классы, которые выводят из matlab.unittest.constraints.Constraint
класс должен также заменить getDiagnosticFor
метод. Этот метод должен оценить фактическое значение против ограничения и обеспечить Diagnostic
объект. В этом примере, getDiagnosticFor
возвращает StringDiagnostic
объект.
methods function diag = getDiagnosticFor(constraint,actual) import matlab.unittest.diagnostics.StringDiagnostic if constraint.sizeMatchesExpected(actual) diag = StringDiagnostic('HasSameSizeAs passed.'); else diag = StringDiagnostic(sprintf(... 'HasSameSizeAs failed.\nActual Size: [%s]\nExpectedSize: [%s]',... int2str(size(actual)),... int2str(size(constraint.ValueWithExpectedSize)))); end end end
Следующий код предоставляет полное содержимое HasSameSizeAs
.
classdef HasSameSizeAs < matlab.unittest.constraints.Constraint properties(SetAccess = immutable) ValueWithExpectedSize end methods function constraint = HasSameSizeAs(value) constraint.ValueWithExpectedSize = value; end function bool = satisfiedBy(constraint,actual) bool = constraint.sizeMatchesExpected(actual); end function diag = getDiagnosticFor(constraint,actual) import matlab.unittest.diagnostics.StringDiagnostic if constraint.sizeMatchesExpected(actual) diag = StringDiagnostic('HasSameSizeAs passed.'); else diag = StringDiagnostic(sprintf(... 'HasSameSizeAs failed.\nActual Size: [%s]\nExpectedSize: [%s]',... int2str(size(actual)),... int2str(size(constraint.ValueWithExpectedSize)))); end end end methods(Access = private) function bool = sizeMatchesExpected(constraint,actual) bool = isequal(size(actual),size(constraint.ValueWithExpectedSize)); end end end
В командной строке создайте тест для интерактивного тестирования.
import matlab.unittest.TestCase
testCase = TestCase.forInteractiveUse;
Протестируйте передающий случай.
testCase.verifyThat(zeros(5),HasSameSizeAs(repmat(1,5)))
Verification passed.
Протестируйте провальный случай.
testCase.verifyThat(zeros(5),HasSameSizeAs(ones(1,5)))
Verification failed. --------------------- Framework Diagnostic: --------------------- HasSameSizeAs failed. Actual Size: [5 5] ExpectedSize: [1 5]
getDiagnosticFor
| matlab.unittest.constraints.Constraint
| satisfiedBy