gpt4 book ai didi

objective-c - 使用从测试方法调用的方法的类的 OCMock

转载 作者:行者123 更新时间:2023-12-01 17:34:50 24 4
gpt4 key购买 nike

我正在尝试测试一个实例化 MFMailComposeViewController 实例的方法。 .被测试的方法调用了MFMailComposeViewController的几种方法包括setSubject: .

我想测试 setSubject 是否发送了一个特定的 NSString,在本例中为 @"Test Message"。
无论我为模拟 stub 中的预期字符串指定什么,都没有失败。

在单元测试类中:

#import <OCMock/OCMock.h>

- (void)testEmail {
TestClass *testInstance = [[TestClass alloc] init];

id mock = [OCMockObject mockForClass:[MFMailComposeViewController class]];
[[mock stub] setSubject:@"Test Message"];

[testInstance testMethod];
}

在测试类中:
- (void)testMethod {
MFMailComposeViewController *mailComposeVC = [[MFMailComposeViewController alloc] init];
[mailComposeVC setSubject:@"Bad Message"];
}

Test Suite 'Email_Tests' started at 2011-09-17 18:12:21 +0000
Test Case '-[Email_Tests testEmail]' started.
Test Case '-[Email_Tests testEmail]' passed (0.041 seconds).

测试应该失败了。

我正在 iOS 模拟器中对此进行测试,并在设备上得到相同的结果。

我究竟做错了什么?有没有办法做到这一点?

最佳答案

您创建了一个模拟,但从不将其传递给被测类,或要求模拟验证自己。你需要某种形式的依赖注入(inject)来表示,“不要使用 MFMailComposeViewController,而是使用我给你的其他东西。”

这是一种方法。在被测类中,不是直接分配 MFMailComposeViewController ,而是通过工厂方法获取,如下所示:

@interface TestClass : NSObject

- (void)testMethod;

// Factory methods
+ (id)mailComposeViewController;

@end

这是实现。您正在泄漏,因此请注意工厂方法返回一个自动释放的对象。
- (void)testMethod {
MFMailComposeViewController *mailComposeVC =
[[self class] mailComposeViewController];
[mailComposeVC setSubject:@"Bad Message"];
}

+ (id)mailComposeViewController {
return [[[MFMailComposeViewController alloc] init] autorelease];
}

在测试方面,我们创建了一个覆盖工厂方法的测试子类,以便它提供我们想要的任何东西:
@interface TestingTestClass : TestClass
@property(nonatomic, assign) id mockMailComposeViewController;
@end

@implementation TestingTestClass
@synthesize mockMailComposeViewController;

+ (id)mailComposeViewController {
return mockMailComposeViewController;
}

@end

现在我们准备好进行测试了。我做一些不同的事情:
  • 分配测试子类而不是实际类(不要泄漏!)
  • 使用期望设置模拟,而不仅仅是 stub
  • 将模拟注入(inject)测试子类
  • 最后验证mock

  • 这是测试:
    - (void) testEmail {
    TestClass *testInstance = [[[TestClass alloc] init] autorelease];

    id mock = [OCMockObject mockForClass:[MFMailComposeViewController class]];
    [[mock expect] setSubject:@"Test Message"];
    [testInstance setMockMailComposeViewController:mock];

    [testInstance testMethod];

    [mock verify];
    }

    为了完整起见,我们需要最后一个测试,这是为了保证实际类中的工厂方法返回我们所期望的:
    - (void)testMailComposerViewControllerShouldBeCorrectType {
    STAssertTrue([[TestClass mailComposeViewController]
    isKindOfClass:[MFMailComposeViewController class]], nil);
    }

    关于objective-c - 使用从测试方法调用的方法的类的 OCMock,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7456871/

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