Создание пользовательского ограничения

В этом примере показано, как создать пользовательское ограничение, которое определяет, имеет ли данное значение тот же размер как ожидаемое значение.

В файле в вашей текущей папке создайте класс под названием 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

Следующий код предоставляет полное содержимое 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]

Смотрите также

| |

Похожие темы