【问题标题】:Unit test with mocked web service keeps crashing带有模拟 Web 服务的单元测试不断崩溃
【发布时间】:2012-04-13 15:05:03
【问题描述】:

对于我的项目,我想做一点 TDD,尽管我对 Objective C 和单元测试还很陌生。我创建了一个连接到返回 json 响应的 Web 服务的项目。现在我创建了一个单元测试来模拟 Web 服务,它一直在崩溃(甚至没有失败),我现在完全迷失了......

我有以下设置:

SignUpService(创建一个新帐户)使用ServiceHelper(发出实际的http web 服务请求)。赞这个ServiceHelper.h

@protocol ServiceHelperProtocol <NSObject> 
@required
- (NSString *)get:(NSString *)url; 
@end

@interface ServiceHelper : NSObject <ServiceHelperProtocol> {
    NSMutableData *receivedData; 
}

还有SignUpService.h

@class ServiceHelper;

@protocol SignUpServiceProtocol <NSObject>
- (NSString *)createUserAccount:(CreateUserAccountRequest *)createUserAccountRequest;
- (bool)doesUsernameExist:(NSString *)userName;
- (BOOL)isEmailValid:(NSString *)email;
- (BOOL)doesEmailExist:(NSString *)email;
@end

@interface SignUpService : NSObject <SignUpServiceProtocol> {
    id <ServiceHelperProtocol> serviceHelper;
}

@property(strong) id <ServiceHelperProtocol> serviceHelper;
- (id)initWithHelper:(id <ServiceHelperProtocol>)myServiceHelper;

接下来是单元测试(SignUpServiceTests.h 和实现)

@interface SignUpServiceTests : SenTestCase {
    id <NSObject, ServiceHelperProtocol> serviceHelper;

    SignUpService *signUpService;
    CreateUserAccountRequest *createUserAccountRequest;
}
@property(nonatomic, strong) SignUpService *signUpService;
@property(nonatomic, strong) CreateUserAccountRequest *createUserAccountRequest;
@property(nonatomic, strong) id <NSObject, ServiceHelperProtocol> serviceHelper;

以及实现:

@implementation SignUpServiceTests

@synthesize signUpService;
@synthesize createUserAccountRequest;
@synthesize serviceHelper;

- (void)setUp {
    [super setUp];

    // Set-up code here.
    self.createUserAccountRequest = [[CreateUserAccountRequest alloc] init];
    self.createUserAccountRequest.firstName = @"first-name";
    self.createUserAccountRequest.lastName = @"last-name";
    .....

    self.serviceHelper = [ServiceHelper new];

    self.signUpService = [[SignUpService alloc] initWithHelper:(id <ServiceHelperProtocol>) self.serviceHelper];
}

- (void)tearDown {
    // Tear-down code here.
    [super tearDown];
}

- (void)testOnCreateUserAccountShouldReturnCreatedUserIdWhenCorrectResponseFromService {
    id mock = [OCMockObject partialMockForObject:(NSObject *) (id <ServiceHelperProtocol>) self.serviceHelper];
    [[[mock stub] andReturn:@"{\"status\":\"ok\",\"create_user\":\"12\"}"] get:[OCMArg any]];

    assertThat([self.signUpService createUserAccount:self.createUserAccountRequest], equalTo(@"12"));
}

该项目包含 OCMock 1.77 版和 OCHamcrest 库。

由于某种原因,测试不断崩溃,并显示“进程以退出代码 0 完成”。当我调试时,我看不到出了什么问题。我觉得它与内存管理有关,还是与 OCMock 和 ARC 有关? (如建议的herehere

对新手 Objective C 开发人员有什么想法或建议吗?

【问题讨论】:

    标签: objective-c unit-testing protocols ocmock


    【解决方案1】:

    如果没有更多信息,我怀疑这不是因为内存问题,而是因为加载程序在启动 octest 时找不到 OCMock 框架。在 OS X 中,链接器(在构建时)使用与加载器(在运行时)不同的方式来定位框架。

    OCMock 的公开版本是在加载器路径中使用 @rpath 构建的。这为运行时的项目布局提供了相当程度的灵活性,但一开始可能会令人困惑。作为第一步,您能否确保将 LC_RPATH 环境变量设置为包含 OCMock 框架可用的目录? dyld 手册页上对@rpath 的讨论更详细。

    对了,OCMock 2.0 最近发布了。

    【讨论】:

    • 嗨,埃里克,感谢您的评论。我不太了解这个编译器/环境设置,你能帮我找出需要在 Xcode 中放置这些变量或@rpath 的位置吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多