【问题标题】:Assert struct equality in OCHamcrest在 OCHamcrest 中断言结构相等
【发布时间】:2012-03-06 05:36:41
【问题描述】:

假设我想断言两个结构是等价的:

// Using CGPoint here for brevity, but my question applies to any struct type
CGPoint a = CGPointMake(1, 2);
CGPoint b = CGPointMake(1, 2);
STAssertEquals(a, b, @"this works");
assertThat(a, equalTo(b));

有没有办法使用 Hamcrest 编写断言,就像上面的 STAssertEquals 一样工作? assertThat 行无法编译,因为宏需要 id 参数,而结构不是。我尝试了equalTo 匹配器的变体,例如sameInstance,但它们似乎都需要id 类型的参数。接下来,我认为一个好的解决方法是断言任意表达式具有YESNO 值。像这样的:

assertThat(a == b);

或者这个:

assertThat(a == b, isTrue());

但我在 Hamcrest 没有看到这样的东西。

我是否遗漏了一些明显的东西?显然,我可以通过使用诸如 STAssertEquals 之类的 SenTest 宏来完成我想做的事情,但我曾期望使用 Hamcrest 实现这些断言会很简单,因此我的所有断言都具有一致的风格。

我也知道我可以通过为我正在比较的特定结构实现自定义 Hamcrest 匹配器来做到这一点。但我真的在寻找一个简单的断言/匹配器,它可以比较任何 C 结构以实现简单的字节相等。

也许只是因为我提到的所有可能性都不可能与 Hamcrest 一起开箱即用。如果这是真的,我会接受一个令人信服的解释作为答案。

谢谢

【问题讨论】:

    标签: objective-c hamcrest


    【解决方案1】:

    OCHamcrest 旨在检查对象是否匹配,因此assertThat 将参数作为第一个参数(将匹配器作为第二个参数)。

    对标量的支持有限。例如,你可以说

    assertThatInteger(a, equalToInteger(b));
    

    已将 NSValue 匹配器的更改发送给我,但我还没有时间查看它。它为 NSPoint、NSSize 等打开了大门。但是,OCHamcrest 中的标量支持仍然是一种解决方法。

    对于您自己的结构,我会使用STAssertEquals。问题是这是一个全有或全无的相等比较,这可能会使您的测试变得脆弱。如果发生这种情况,编写您自己的支持每个字段匹配的自定义匹配器会更好。 (我会尝试使 NSValue 匹配器成为您可以子类化的东西。)

    【讨论】:

    • 感谢您的信息。我同意对具有多个元素的结构进行大规模相等性测试可能会导致脆弱测试。我什至看不出它有多大用处。
    猜你喜欢
    • 2019-03-28
    • 1970-01-01
    • 1970-01-01
    • 2012-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-24
    相关资源
    最近更新 更多