В этом примере показано, как создать пользовательское ограничение, определяющее, имеет ли данное значение тот же размер, что и ожидаемое значение.
В файле текущей папки создайте класс с именем 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 | matlab.unittest.diagnostics.Diagnostic | matlab.unittest.diagnostics.StringDiagnostic | satisfiedBy