G. Lee による Test-Driven iOS development という本を読んでいて、この単体テストに出くわしましたが、理解できません。まず、さらにコードが必要な場合は、すぐにお知らせください。
-(void)testDelegateNotifiedOfErrorWhenNewsBuilderFails
{
MockNewsBuilder *builder = [MockNewsBuilder new];
builder.arrayToReturn = nil;
builder.errorToSet = underlyingError;
newsManager.newsBuilder = builder;
[newsManager receivedNewsJSON:@"Fake Json"];
...
}
-(void)receivedNewsJSON:(NSString *)objectNotation
{
NSError *error = nil;
// As you see error is nil and I am passing in a nil error.
NSArray *news = [_newsBuilder newsFromJSON:objectNotation error:&error];
...
}
@implementation MockNewsBuilder
-(NSArray *)newsFromJSON:(NSString *)objectNotation error:(NSError **)error
{
// But once I arrive here, error is no longer nil.
// (NSError **) error = 0x00007fff5cb887f0 domain: @"Fake Json" - code: 0
...
}
エラーはどのように自動的に設定されますか?
アップデート:
皆様、活発な議論とアドバイスをありがとうございました。答えは、&のために呼び出し側がエラーインスタンスを取得する方法を説明しています。私はそれを明確に理解しています。nil である必要があるにもかかわらず、呼び出し側が入力された NSError インスタンスを指している理由について、私の疑問は残ります。内部にエラー インスタンスを設定していないのにnewsFromJSON:error:
、どのようにそこに既に入力されているのでしょうか?
変更したばかり[newsManager receivedNewsJSON:@"Fake Json1"];
で、内のエラー インスタンスがすぐにnewsFromJSON:error:
反映され
(NSError **) error = 0x00007fff5b9b27f0 domain: @"Fake Json1" - code: 0
ます。その非常に紛らわしい...