Я пытаюсь высмеять вызов mutableCopy
с использованием OCMock и GHUnit на iOS.Неожиданный сбой с использованием OCMock, издевательский 'mutableCopy' на NSString
Несмотря на прохождение теста, во время очистки я получаю исключение EXC_BAD_ACCESS
, и я пытаюсь понять, почему.
Взгляните на это. Этот тест показывает, что можно высмеять mutableCopy
на макет NSString
. В этом тесте я возвращаю еще NSString
, а не NSMutableString
. Это просто, чтобы продемонстрировать, что ожидание mutableCopy
запущено, и тест проходит.
#import <GHUnitIOS/GHUnit.h>
#import "OCMock.h"
@interface TestItClass : GHTestCase @end
@implementation TestItClass
// Test that mutableCopy on an NSString is mockable.
- (void)test_1_mutableCopyOfString_shouldBeMockable_givenAStringIsReturned {
NSString *string = [OCMockObject mockForClass:NSString.class];
NSString *copy = @"foo";
[(NSString *) [[(id) string expect] andReturn:copy] mutableCopy];
// MutableCopy is mocked to return a string, not a mutable string!
// This is clearly wrong from a static typing point of view, but
// the test passes anyway, which is ok.
NSMutableString *result = [string mutableCopy];
GHAssertEquals(result, copy, nil);
[(id)string verify];
}
Теперь я могу изменить макет ожидания, так что mutableCopy
теперь возвращает NSMutableString
. Тест все еще проходит, но при срыве теста я получаю исключение EXC_BAD_ACCESS
.
- (void)test_2_mutableCopyOfString_shouldBeMockable_givenAMutableStringIsReturned {
NSString *string = [OCMockObject mockForClass:NSString.class];
NSMutableString *copy = [@"foo" mutableCopy];
[(NSString *) [[(id) string expect] andReturn:copy] mutableCopy];
// Now mutableCopy is mocked to return a mutable string!
// The test now blows up during the test teardown! Why?
NSMutableString *foo = [string mutableCopy];
GHAssertEquals(foo, copy, nil);
[(id)string verify];
}
@end
В обоих тестах проверяется работа, что касается утверждений. Это показывает, что оба теста хорошо сконструированы и что макетные ожидания увольняются, как ожидалось. Тем не менее, второй тест не в слезу вниз с плохим доступом к памяти:
Simulator session started with process 7496
Debugger attached to process 7496
2013-03-11 18:23:05.519 UnitTests[7496:c07] TestItClass/test_2_mutableCopyOfString_shouldBeMockable_givenAMutableStringIsReturned ✘ 0.00s
2013-03-11 18:23:06.466 UnitTests[7496:c07] Re-running: TestItClass/test_2_mutableCopyOfString_shouldBeMockable_givenAMutableStringIsReturned <GHTest: 0x7793340>
Exception: EXC_BAD_ACCESS (code=1, address=0x11dfe3ea))
Можете ли вы предложить мне, почему это может происходить?
Спасибо, Джо
Пожалуйста, включите ваш '- (void) tearDown' methord в вопрос –
Не существует явного tearDown; это только тот запас, который предоставляет GHUnit. –
@Shineeth На самом деле, похоже, что авария находится в срыве одного из классов OCMock. Я разместил часть ответа ниже. –