Objective c 如何在objective c中模拟类方法以与TDD一起使用

Objective c 如何在objective c中模拟类方法以与TDD一起使用,objective-c,unit-testing,mocking,tdd,Objective C,Unit Testing,Mocking,Tdd,我正在使用第三方框架向服务器发送数据。我模仿第三方框架来隔离和测试我的代码如何与之交互。这是为了避免在单元测试时等待从网络获取数据,因为我想测试我编写的错误处理代码 我没有使用OCMock或类似的东西,我是通过子类化第三方框架来编写自己的mock对象 我的方法是这样的- - (void)loginWithCredentials:(NSDictionary *)credentials { NSDictionary *credentials = [self credentials];

我正在使用第三方框架向服务器发送数据。我模仿第三方框架来隔离和测试我的代码如何与之交互。这是为了避免在单元测试时等待从网络获取数据,因为我想测试我编写的错误处理代码

我没有使用OCMock或类似的东西,我是通过子类化第三方框架来编写自己的mock对象

我的方法是这样的-

- (void)loginWithCredentials:(NSDictionary *)credentials
{
    NSDictionary *credentials = [self credentials];
    NSString *username = [credentials objectForKey:kUserCredintialUsername];
    NSString *password = [credentials objectForKey:kUserCredintialPassword];

    [ThirdPartyClass loginWithUsername:username 
                           andPassword:password 
                                 block:^(ThirdPartyClass *user, NSError *error){
    if (user) {
        NSLog(@"We logged in");
    }
    else if (error) {
        NSLog(@"%@", [error errorString]);
    }
}];
}

我想做的是在我的单元测试中使用用户名:和密码:block:在我的mock上调用
login。显然,当前方法是不稳定的,因为它没有遵循“告诉,不要问”(我没有告诉
loginWithCredentials:
调用哪个类
loginWithUser…block:
on)。我认为解决这个问题的唯一方法是向我的实例或类添加一个类变量,或者向
loginWithCredentials:
添加一个参数,这样我就可以替换我的mock了。这样做并不能使生产代码变得清晰,它已经作为第三方库的适配器编写。相反,我更愿意尝试重构带有凭据的
登录:
方法。

上有一个HTTP存根库。它通过捕获传出请求和返回文件数据来工作。它还允许对不同类型网络的加载速度进行初步模拟

您可以使用stub或fake(即)swizzle类方法替换带有username:and password:block:
登录。有什么理由不想使用能够提供这种行为的测试库吗?我是它的粉丝,它可以让你写一些语句,比如
[[ThirdPartClass]应该]接收:@selector(loginWithUsername:andPassword:block:)andReturn:mockObject]
。我发现这比手动swizzle方法容易得多,特别是因为我不必撤消swizzle。我曾考虑过swizzle,但它似乎相当脆弱,我担心如果做得不好,我可能会得到错误的单元测试通过确认。这个问题还散发出一种代码味道,我可能会用一种不太理想的方式编写我的方法。至于测试库,我只是试图避免在代码中加入另一个第三方库。