Утвердить структурное равенство в OCHamcrest - PullRequest
0 голосов
/ 06 марта 2012

Скажем, я хочу утверждать, что две структуры эквивалентны:

// 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 типизированных параметров.Затем я подумал, что хорошим обходным путем будет утверждение, что произвольное выражение имеет значение YES или NO.Примерно так:

assertThat(a == b);

или вот что:

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

Но я не вижу ничего подобного в Хэмкресте.

Я что-то упускаю из виду?Ясно, что я могу выполнить то, что хочу, используя макросы SenTest, такие как STAssertEquals, но я ожидал, что реализовать эти утверждения с помощью Hamcrest будет просто, чтобы все мои утверждения имели согласованный стиль.

Я также знаю, что могу сделать это, внедрив специальный механизм сопоставления Hamcrest для конкретных структур, которые я сравниваю.Но я действительно искал простое утверждение / сопоставление, которое может просто сравнить любые структуры C для простого байтового равенства.

Возможно, это просто тот случай, когда ни одна из упомянутых мною возможностей невозможна из коробки с Hamcrest,Если это правда, я приму убедительное объяснение этого эффекта в качестве ответа.

Спасибо

1 Ответ

0 голосов
/ 07 марта 2012

OCHamcrest предназначен для проверки объектов на совпадения, поэтому assertThat принимает аргумент в качестве первого параметра (и совпадение в качестве второго).

Ограничена поддержка скаляров.Например, вы можете сказать:

assertThatInteger(a, equalToInteger(b));

Мне отправлено изменение для сопоставителя NSValue, но у меня еще не было времени его просмотреть.Это открывает двери для NSPoint, NSSize и т. Д. Но, тем не менее, скалярная поддержка в OCHamcrest является обходным путем.

Для ваших собственных структур я бы использовал STAssertEquals.Проблема в том, что это сравнение равенства «все или ничего», которое может сделать ваши тесты хрупкими.Если это произойдет, было бы лучше написать свой собственный сопоставитель, который поддерживает сопоставление для каждого поля.(Я постараюсь сделать сопоставление NSValue чем-то, что вы можете подклассить.)

...