我想断言两个结构是等价的:
// 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));
没有办法使用像上面STAssertEquals
那样工作的Hamcrest写一个断言吗? assertThat
行无法编译,因为宏期望id
参数,而结构不是。{1}}。我尝试了equalTo
匹配器的变体,例如sameInstance
,但它们似乎都需要id
类型的参数。接下来,我认为一个好的解决方法是声明任意表达式具有YES
或NO
值。像这样:
assertThat(a == b);
或者这个:
assertThat(a == b, isTrue());
但我在Hamcrest看不到这样的事情。
我错过了一些明显的东西吗?很明显,我可以通过使用STAssertEquals
这样的SenTest宏来完成我想做的事情,但我原本以为使用Hamcrest实现这些断言很简单,所以我的所有断言都有一致的风格。
我也知道我可以通过为我比较的特定结构实现自定义Hamcrest匹配器来实现这一点。但我真的在寻找一个简单的断言/匹配器,可以比较任何C结构,以实现简单的字节相等。
也许就是这种情况,我提到的任何可能性都不可能与Hamcrest开箱即用。如果这是真的,我会接受一个令人信服的解释,作为答案。
由于
答案 0 :(得分:0)
OCHamcrest旨在检查对象的匹配,因此assertThat
将参数作为第一个参数(而匹配器作为第二个参数)。
对标量的支持有限。例如,您可以说
assertThatInteger(a, equalToInteger(b));
我已经向NSValue匹配器发送了一个更改,但我还没有时间对其进行审核。它为NSPoint,NSSize等打开了大门。但是,OCHamcrest中的标量支持仍是一种解决方法。
对于你自己的结构,我会使用STAssertEquals
。问题在于它是一种全有或全无的平等比较,这可能会使您的测试变得脆弱。如果发生这种情况,编写支持每个字段匹配的自定义匹配器会更好。 (我将尝试使NSValue匹配器成为可以继承的子类。)