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

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

В файле в текущей папке создайте класс с именем HasSameSizeAs который происходит от matlab.unittest.constraints.BooleanConstraint класс. Конструктор классов принимает ожидаемое значение, размер которого сравнивается с размером фактического значения. Ожидаемое значение сохранено в ValueWithExpectedSize свойство. Рекомендуемая практика состоит в том, чтобы сделать BooleanConstraint реализации неизменяемы, поэтому установите свойство SetAccess атрибут к immutable.

classdef HasSameSizeAs < matlab.unittest.constraints.BooleanConstraint
    
    properties(SetAccess = immutable)
        ValueWithExpectedSize
    end
    
    methods
        function constraint = HasSameSizeAs(value)
            constraint.ValueWithExpectedSize = value;
        end
    end
    
end

В methods блок с private access, задайте вспомогательный метод sizeMatchesExpected который определяет, имеют ли фактическое и ожидаемые значения одинаковый размер. Этот метод вызывается другими методами ограничений.

methods(Access = private)
    function bool = sizeMatchesExpected(constraint,actual)
        bool = isequal(size(actual),size(constraint.ValueWithExpectedSize));
    end
end

The matlab.unittest.constraints.BooleanConstraint класс является подклассом matlab.unittest.constraints.Constraint класс. Поэтому классы, которые получают из BooleanConstraint класс должен переопределить методы Constraint класс. В пределах methods блокируйте, переопределяйте satisfiedBy и getDiagnosticFor методы. The satisfiedBy реализация должна содержать логику сравнения и возвращать логическое значение. The getDiagnosticFor реализация должна оценить фактическое значение относительно ограничения и предоставить Diagnostic объект. В этом примере getDiagnosticFor возвращает StringDiagnostic объект.

methods
    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

Классы, которые получают от BooleanConstraint необходимо реализовать getNegativeDiagnosticFor способ. Этот метод должен предоставить Diagnostic объект, когда ограничение отменено.

Переопределите getNegativeDiagnosticFor в methods блок с protected доступ.

methods(Access = protected)
    function diag = getNegativeDiagnosticFor(constraint,actual)
        import matlab.unittest.diagnostics.StringDiagnostic
        if constraint.sizeMatchesExpected(actual)
            diag = StringDiagnostic(sprintf(...
                ['Negated HasSameSizeAs failed.\nSize [%s] of '...
                'Actual Value and Expected Value were the same '...
                'but should not have been.'],int2str(size(actual))));
        else
            diag = StringDiagnostic('Negated HasSameSizeAs passed.');
        end
    end
end

В обмен на реализацию необходимых методов ограничение наследует соответствующую and, or, и not перегрузки, поэтому их можно комбинировать с другими BooleanConstraint объекты или отрицательные.

Определение класса HasSameSizeAs

Это полный код для HasSameSizeAs класс.

classdef HasSameSizeAs < matlab.unittest.constraints.BooleanConstraint
    
    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 = protected)
        function diag = getNegativeDiagnosticFor(constraint,actual)
            import matlab.unittest.diagnostics.StringDiagnostic
            if constraint.sizeMatchesExpected(actual)
                diag = StringDiagnostic(sprintf(...
                    ['Negated HasSameSizeAs failed.\nSize [%s] of '...
                    'Actual Value and Expected Value were the same '...
                    'but should not have been.'],int2str(size(actual))));
            else
                diag = StringDiagnostic('Negated HasSameSizeAs passed.');
            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
import matlab.unittest.constraints.HasLength
testCase = TestCase.forInteractiveUse;

Протестируйте проходящий случай. Тест прошел, потому что один из or условия, HasLength(5), верно.

testCase.verifyThat(zeros(5),HasLength(5) | ~HasSameSizeAs(repmat(1,5)))
Verification passed.

Протестируйте неисправный случай. Тест не пройден, потому что один из and условия, ~HasSameSizeAs(repmat(1,5)), является ложным.

testCase.verifyThat(zeros(5),HasLength(5) & ~HasSameSizeAs(repmat(1,5)))
Verification failed.
    ---------------------
    Framework Diagnostic:
    ---------------------
    AndConstraint failed.
    --> + [First Condition]:
         |   HasLength passed.
         |   
         |   Actual Value:
         |        0     0     0     0     0
         |        0     0     0     0     0
         |        0     0     0     0     0
         |        0     0     0     0     0
         |        0     0     0     0     0
         |   Expected Length:
         |        5
    --> AND
        + [Second Condition]:
         |   Negated HasSameSizeAs failed.
         |   Size [5  5] of Actual Value and Expected Value were the same but should not have been.
        -+---------------------

См. также

| | | | | |

Похожие темы