Каков наилучший способ для модульного тестирования метода с параметром, который является неизменным и не имеет инициализатора? - PullRequest
0 голосов
/ 28 февраля 2020

Вопрос

Я пытаюсь провести модульное тестирование своей реализации метода протокола, который принимает неизменный объект, которого нет в моем проекте, в качестве параметра. Этот объект не имеет инициализаторов, которые устанавливают его свойства. Каков наилучший способ модульного тестирования в этом сценарии?

Что я пробовал

Я пробовал создавать подклассы и приводить свойства к readwrite, но у вас есть доступ только к супер -class 'ivars, если они явно помечены как @protected. Так как класс не входит в мой проект, я не могу переназначить новую область видимости для ivar.

Я также не могу высмеивать установщик, который не существует, и ivars не доступны для прямой записи через фиктивные объекты.

В конце концов, я решил добавить дополнительный метод, который вызовет рассматриваемый метод, передавая только объекты, свойства которых я могу установить, и я рассмотрел этот дополнительный метод в модульных тестах.

Есть ли лучший способ для модульного тестирования в этом сценарии?

Особенности моего сценария

Я пытаюсь провести модульное тестирование моей реализации userContentController : didReceiveScriptMessage: из протокола WKScriptMessageHandler WebKit и не может найти способ передать экземпляр WKScriptMessage или WKUserContentController с любым установленным свойством.

Для модульного тестирования я создал новый метод, который принимает параметр типа 'id' и вызвал его из userContentController: didReceiveScriptMessage :, передавая WKScriptMessage body prope RTY.

1 Ответ

1 голос
/ 04 марта 2020

Вам это помогает?

TestMessage.h

#import <WebKit/WebKit.h>

@interface TestMessage : WKScriptMessage

- (id) initWithBody:(id)body
          frameInfo:(WKFrameInfo*)frameInfo
               name:(NSString*)name
            webView:(WKWebView*)webView;

@end

TestMessage.m

#import "TestMessage.h"

@interface TestMessage()

@property (nonatomic, strong) id messageBody;
@property (nonatomic, strong) WKFrameInfo* messageFrameInfo;
@property (nonatomic, strong) NSString* messageName;
@property (nonatomic, strong) WKWebView* messageWebView;

@end

@implementation TestMessage

- (id) initWithBody:(id)body
          frameInfo:(WKFrameInfo*)frameInfo
               name:(NSString*)name
            webView:(WKWebView*)webView
{
    self = [super init];

    if (self)
    {
        _messageBody = body;
        _messageFrameInfo = frameInfo;
        _messageName = name;
        _messageWebView = webView;
    }

    return self;
}

- (id) body
{
    return self.messageBody;
}

- (WKFrameInfo *)frameInfo
{
    return self.frameInfo;
}

- (NSString *)name
{
    return self.messageName;
}

- (WKWebView *)webView
{
    return self.messageWebView;
}

@end

Итак, вы в основном создаете подкласс с соответствующими свойствами и затем переопределяем геттеры для свойств суперкласса, чтобы возвращать значения для тех, к которым у вас есть полный доступ.

Это сработало для меня с простым тестом (я уверен, что ваш сценарий более сложный):

- (void) testMessageHandler
{
    WKWebView* webView = [[WKWebView alloc] init];
    WKUserContentController* controller = [[WKUserContentController alloc] init];
    WKFrameInfo* info = [[WKFrameInfo alloc] init];
    NSDictionary* testBody = @{@"testKey" : @"testVal" };

    TestMessage* testMessage = [[TestMessage alloc] initWithBody:testBody
                                                       frameInfo:info
                                                            name:@"Message Name"
                                                         webView:webView];

    // some object conforming to the WKScriptMessageHandler protocol
    [self userContentController:controller
        didReceiveScriptMessage:testMessage];
}


- (void)userContentController:(nonnull WKUserContentController *)userContentController
      didReceiveScriptMessage:(nonnull WKScriptMessage *)message
{
    NSLog(@"Received Script Message... (%@)", message.body);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...