Main Content

本页翻译不是最新的。点击此处可查看最新英文版本。

matlab.unittest.constraints.PublicPropertyComparator 类

命名空间: matlab.unittest.constraints

用于比较 MATLAB 对象数组的公共属性的比较器

描述

matlab.unittest.constraints.PublicPropertyComparator 类提供用于比较 MATLAB® 对象数组的公共属性的比较器。要在测试中使用此比较器,请创建一个 PublicPropertyComparator 实例,并将其指定为 IsEqualTo 约束构造函数的 Using 名称-值参数的值。

isequal 函数、isequaln 函数或 ObjectComparator 类不同,PublicPropertyComparator 类只检查对象数组的公共属性。

创建对象

通常,使用 supportingAllValues 静态方法创建 PublicPropertyComparator 实例。生成的实例以递归方式运算,并支持公共属性中包含的所有数据类型。要为特定用例创建实例,例如当您需要测试给定的数据类型时,请使用本节中的语法之一。

描述

示例

c = matlab.unittest.constraints.PublicPropertyComparator 创建用于比较空对象数组或没有公共属性的对象数组的比较器。如果实际值和预期值是具有相同类和大小的对象数组,或为空对象数组或没有公共属性,则满足该比较器。

示例

c = matlab.unittest.constraints.PublicPropertyComparator(comp) 使用指定的比较器 comp 来比较公共属性中包含的值。使用此语法时,如果实际值和预期值是具有相同类和大小的对象数组,并且它们对应的公共属性中的值满足 comp 中的任一比较器,则满足该比较器。

示例

c = matlab.unittest.constraints.PublicPropertyComparator(___,Name,Value) 支持上述语法中的任何输入参数组合,且可使用一个或多个名称-值参数设置其他选项。例如,c = matlab.unittest.constraints.PublicPropertyComparator("Recursively",true) 创建一个比较器,该比较器在比较公共属性中包含的值时以递归方式运算。

输入参数

全部展开

用于比较公共属性中包含的值的比较器,指定为由 matlab.unittest.constraints 包中分类为比较器的类组成的对象数组。

示例: matlab.unittest.constraints.NumericComparator

示例: matlab.unittest.constraints.StringComparator("IgnoringCase",true)

示例: [matlab.unittest.constraints.LogicalComparator matlab.unittest.constraints.NumericComparator]

名称-值参数

将可选的参数对组指定为 Name1=Value1,...,NameN=ValueN,其中 Name 是参数名称,Value 是对应的值。名称-值参数必须出现在其他参数之后,但参数对组的顺序无关紧要。

示例: c = matlab.unittest.constraints.PublicPropertyComparator(Recursively=true)

在 R2021a 之前,使用逗号分隔每个名称和值,并用引号将 Name 引起来。

示例: c = matlab.unittest.constraints.PublicPropertyComparator("Recursively",true)

要在比较期间忽略的属性,指定为字符串数组或字符向量元胞数组。比较器不比较指定属性的值。

此参数设置 IgnoredProperties 属性。

示例: "IgnoringProperties","Property1"

是否为以递归方式运算,指定为数值或逻辑值 0 (false) 或 1 (true)。

当值为 true 时,实际和预期对象数组的公共属性中的值也可以是 MATLAB 对象数组,比较器以递归方式比较这些值。当值为 false 时,实际和预期对象数组的公共属性中的所有值都必须具有 comp 支持的类型。例如,在以下代码中,c1c2 都可以比较在公共属性中包含数值的对象数组。但是,只有 c2 可以比较在公共属性中包含对象数组或数值的对象数组。

import matlab.unittest.constraints.PublicPropertyComparator
import matlab.unittest.constraints.NumericComparator

c1 = PublicPropertyComparator(NumericComparator);
c2 = PublicPropertyComparator(NumericComparator,"Recursively",true);

此参数设置 Recursive 属性。

属性

全部展开

要在比较期间忽略的属性,以字符向量元胞数组形式返回。

此属性由 IgnoringProperties 名称-值参数设置。

属性:

GetAccess
public
SetAccess
private

是否为以递归方式运算,返回为逻辑值 0 (false) 或 1 (true)。如果使用 supportingAllValues 静态方法创建 PublicPropertyComparator 实例,则默认属性值为 true。否则,默认属性值为 false

此属性由 Recursively 名称-值参数设置。

属性:

GetAccess
public
SetAccess
private

方法

全部展开

示例

全部折叠

使用 PublicPropertyComparator 类比较实际值和预期值。

在当前文件夹内一个名为 Employee.m 的文件中创建 Employee 类。该类有公共属性 Name 和私有属性 Location

classdef Employee
    properties (SetAccess=immutable)
        Name
    end
    properties (Access=private)
        Location
    end
    methods
        function obj = Employee(name,location)
            arguments
                name = "";
                location = "";
            end
            obj.Name = name;
            obj.Location = location;
        end
    end
end

导入此示例中使用的类。

import matlab.unittest.TestCase
import matlab.unittest.constraints.IsEqualTo
import matlab.unittest.constraints.PublicPropertyComparator
import matlab.unittest.constraints.StringComparator

创建一个供交互测试的测试用例。

testCase = TestCase.forInteractiveUse;

使用 PublicPropertyComparator 实例来比较两个空的 Employee 对象。测试通过。

testCase.verifyThat(Employee.empty,IsEqualTo(Employee.empty, ...
    "Using",PublicPropertyComparator))
Verification passed.

创建两个非空 Employee 对象,并使用 IsEqualTo 约束比较它们。在此示例中,因为 Location 属性中的值不同,测试失败。

e1 = Employee("Sam","Building A");
e2 = Employee("Sam","Building B");
testCase.verifyThat(e1,IsEqualTo(e2))
Verification failed.
    ---------------------
    Framework Diagnostic:
    ---------------------
    IsEqualTo failed.
    --> ObjectComparator failed.
        --> The objects are not equal using "isequaln".
        
        Actual Value:
          Employee with properties:
        
            Name: "Sam"
        Expected Value:
          Employee with properties:
        
            Name: "Sam"
    ------------------
    Stack Information:
    ------------------
    In C:\work\CompareValuesUsingPublicPropertyComparatorExample.m (CompareValuesUsingPublicPropertyComparatorExample) at 35

使用 PublicPropertyComparator 实例重复该测试。要执行比较,请将适当的比较器传递给 PublicPropertyComparator 构造函数。尽管 e1.Locatione2.Location 具有不同的值,测试仍通过,因为比较器只检查 e1e2 的公共属性。

testCase.verifyThat(e1,IsEqualTo(e2, ...
    "Using",PublicPropertyComparator(StringComparator)))
Verification passed.

创建一个新的 Employee 对象,并将其与 e1 进行比较。测试失败,因为 e1.Namee3.Name 的值不同。

e3 = Employee("sam","Building C");
testCase.verifyThat(e1,IsEqualTo(e3, ...
    "Using",PublicPropertyComparator(StringComparator)))
Verification failed.
    ---------------------
    Framework Diagnostic:
    ---------------------
    IsEqualTo failed.
    --> Path to failure: <Value>.Name
        --> StringComparator failed.
            --> The strings are not equal.
            
            Actual Value:
                "Sam"
            Expected Value:
                "sam"
    
    Actual Value:
      Employee with properties:
    
        Name: "Sam"
    Expected Value:
      Employee with properties:
    
        Name: "sam"
    ------------------
    Stack Information:
    ------------------
    In C:\work\CompareValuesUsingPublicPropertyComparatorExample.m (CompareValuesUsingPublicPropertyComparatorExample) at 49

要使测试通过,请使用忽略大小写的比较器。

testCase.verifyThat(e1,IsEqualTo(e3, ...
    "Using",PublicPropertyComparator( ...
    StringComparator("IgnoringCase",true))))
Verification passed.

您也可以指示比较器在比较期间忽略 Name 属性。

testCase.verifyThat(e1,IsEqualTo(e3, ...
    "Using",PublicPropertyComparator( ...
    StringComparator,"IgnoringProperties","Name")))
Verification passed.

局限性

版本历史记录

在 R2014a 中推出