частичный макет для класса

Я использую OCMock для модульного тестирования. Я знаю, что в OCMock есть функция, которая может частично имитировать объект. Я имею в виду этот:

[OCMockObject partialMockForObject:anObject]

Но у меня есть класс, который состоит только из функций класса. Например. MyHelperClazz, я использую его только как [MyHelperClazz helperFunc].

Мне нужно имитировать некоторые функции в MyHelperClazz, но для других я хочу, чтобы мой тестовый код запускал реальную реализацию MyHelperClazz. Итак, мне нужно частично издеваться над этим. Но это класс, а не объект.

Как я могу частично имитировать класс с помощью OCMock? Если это невозможно, как достичь моей цели?


person Leem.fin    schedule 28.06.2016    source источник


Ответы (2)


Обычный макет класса позволяет вам имитировать методы экземпляра этого класса и позволяет вам имитировать методы класса класса. См. документацию: http://ocmock.org/reference/#mocking-class-methods< /а>

person Erik Doernenburg    schedule 30.06.2016

Я добился этого с помощью NSUserDefaults вот так.

ClassThatUsesNSDefaults *nsDefaultsConsumer = [[ClassThatUsesNSDefaults alloc] init];

// Make an instance of the thing to partially mock
id partialUserDefaultsMock = OCMPartialMock([NSUserDefaults standardUserDefaults]);

// Configure the partial mocked parts
OCMStub([partialUserDefaultsMock boolForKey:@"interesting-key"]).andReturn(YES);
OCMStub([partialUserDefaultsMock stringForKey:@"another-interesting-key"]).andReturn(@"interesting-value");

// Set up a class mock and have a static accessor return your partial mock,
// this even works with nasty singletons.
id mockedUserDefaultsClass = OCMClassMock([NSUserDefaults class]);
OCMStub([mockedUserDefaultsClass standardUserDefaults]).andReturn(partialUserDefaultsMock);

// Test Away
BOOL isEverythingOK = [nsDefaultsConsumer isEverythingOK];
XCTAssertTrue(isEverythingOK);

// Don't forget
[particalUserDefaultsMock stopMocking];
[mockedUserDefaultsClass stopMocking];
person Gareth Shapiro    schedule 03.08.2018