gpt4 book ai didi

ios - 使用 OCMock 对本地对象或依赖注入(inject)进行单元测试?

转载 作者:行者123 更新时间:2023-11-29 00:12:57 26 4
gpt4 key购买 nike

尝试为以下功能创建简单测试:

-(void)presentWithString:(NSString *)name
{
CustomVC *customVC = [[CustomVC alloc] initWithName:name];
UINavigationController *nav = [[UINavigationController alloc] init];
nav.viewControllers = @[customVC];

dispatch_async(dispatch_get_main_queue(), ^{
[self.vc presentViewController:nav animated:YES completion:nil];
});
}

我可以通过依赖注入(inject)将它分成 block ,但不知道如何以任何一种方式编写正确的测试。这个例子的最佳实践是什么?

最佳答案

想要测试什么?您的方法中发生了 3 件事:

  1. CustomVC 是使用传递的 name 创建的。
  2. CustomVC 嵌入在导航 Controller 中。
  3. 导航 Controller 位于 self.vc 上。

您可以编写一个测试来检查整个流程:

- (void)testPresentWithString_shouldPresentCustomVC_withPassedName {

// Arrange
NSString *expectedName = @”name”;
XCTestExpectation *exp = [self expectationWothDescription:@”presentVC called”];

TestClass *sut = [[TestClass alloc] init];
id vcMock = OCMClassMock([UIViewController class]);
sut.vc = vcMock;

OCMExpect([vcMock presentViewController:OCM_ANY animated:YES completion:nil]).andDo(^(NSInvocation *invocation) {

UINavigationController *nav = nil;
[invocation getArgument:&nav atIndex:2];

CustomVC *custom = nav.viewControllers.firstObject;

// Assert
XCTAssertNotNil(nav);
XCTAssertTrue([nav isKindOfClass:[UINavigationController class]]);
XCTAssertEqual(nav.viewControllers.count, 1);
XCTAssertNotNil(custom);
XCTAssertTrue([custom isKindOfClass:[CustomVC class]]);
XCTAssertEqual(custom.name, expectedName);

[exp fulfill];
});

// Act
[sut presentWithString:expectedName];

// Assert
[self waitForExpectationsWithTimeout:1 handler:nil];
OCMVerifyAll(vcMock);

// Cleanup
[vcMock stopMocking];
}

此代码会检查您的方法中发生的所有事情 - 使用特定参数调用的方法,这些参数中的第一个是仅嵌入了 CustomVC 的导航 Controller 以及此 CustomVC 已设置name。显然,我假设可以从外部设置被测类的 vc 属性,并且可以读取 CustomVC 上的 name。如果没有,测试其中的某些部分可能会更困难。

我个人不会对此进行单元测试。我会单独测试 CustomVC 的初始化,并将整个演示文稿置于 UI 测试下。

如果一切都清楚,请告诉我!

旁注:我凭内存在手机上编写了此内容,因此代码中可能存在小错误。当我有机会用 Xcode 检查时我会更新它。

关于ios - 使用 OCMock 对本地对象或依赖注入(inject)进行单元测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45888254/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com