特定のペン先に要素が存在するかどうかを確認する単体テストを作成しています。たとえば、ペン先ビューをループして、参照アウトレット 'commentTextView' が存在するかどうかを確認し、そのテキスト ビューが存在するかどうかを確認します。
現在、ターゲットが存在するかどうかを確認するメソッド (ボタンをクリックしたときに特定のセレクターが呼び出されるかどうかを確認するなど) しか表示されませんが、必要なものは確認されません。
特定のペン先に要素が存在するかどうかを確認する単体テストを作成しています。たとえば、ペン先ビューをループして、参照アウトレット 'commentTextView' が存在するかどうかを確認し、そのテキスト ビューが存在するかどうかを確認します。
現在、ターゲットが存在するかどうかを確認するメソッド (ボタンをクリックしたときに特定のセレクターが呼び出されるかどうかを確認するなど) しか表示されませんが、必要なものは確認されません。
私はここでいくつかの仮定を立てているので、私がベースである場合はお知らせください.
1) アウトレットが接続されるオブジェクトのリストと、それらのアウトレットのリストがあります。(例えば、ファイルの所有者はMyViewController
クラスであり、アウトレットview
、label
、などを持っbutton
ています。UITableView
アウトレットdelegate
、dataSource
、 などを持つ があります。)
2) nib は、1 のすべてのオブジェクトを実際に見つけることができるように設計されていますUIControl
。で見つけるviewWithTag:
これらが真であると仮定すると、基本的に次のことを行うことでペン先がロードされることをテストできます(疑似コードで)
for each referencingObject in nibObjects
{
for each outletName in referencingObject.outletNames
{
assertExistence(/* is an object referenced by this outlet? */)
assertProperties(/* does the object conform to the properties expected for this referencing object / outlet pairing? */)
}
}
私はこれの実装に突き刺し始めました。iOS nib はキーと値のコーディングに大きく基づいているため、nib のテストでは、その価値を探る可能性がたくさんあると思います。SO を降りて勉強しなければならないので、nib 内のオブジェクトから送信されたアクションの処理には取り掛かりませんでしたが、これまでに行ったことを共有します。
SenTestCase
サブクラスに記述したテスト メソッド コードは次のとおりです。
ViewController *vc = [[ViewController alloc] init];
UINib *nib1 = [UINib nibWithNibName:@"ViewController1" bundle:nil];
NSArray *topLevelObjects = [nib1 instantiateWithOwner:vc options:nil];
ReferencingObject *filesOwnerReferencingObject = [[ReferencingObject alloc] init];
filesOwnerReferencingObject.object = vc;
//Make a referenced object outlet for the view
ReferencedOutlet *viewOutlet = [[ReferencedOutlet alloc] init];
viewOutlet.name = @"view";
viewOutlet.propertyAssertionBlock = ^(id object) {
UIView *theView = (UIView *)object;
STAssertEquals(1.0f, theView.alpha, @"shouldn't have any transparency");
};
//Make a referenced object outlet for the label
ReferencedOutlet *labelOutlet = [[ReferencedOutlet alloc] init];
labelOutlet.name = @"label";
labelOutlet.propertyAssertionBlock = ^(id object) {
UILabel *theLabel = (UILabel *)object;
NSString *expectedLabelText = @"ViewController1.xib";
STAssertTrue([expectedLabelText isEqualToString:theLabel.text], nil);
};
filesOwnerReferencingObject.outlets = @[ viewOutlet, labelOutlet ];
NSArray *referencingObjects = @[ filesOwnerReferencingObject ];
for (ReferencingObject *referencingObject in referencingObjects)
{
for (ReferencedOutlet *outlet in referencingObject.outlets)
{
id object = [filesOwnerReferencingObject.object valueForKey:outlet.name];
STAssertNotNil(object, nil);
outlet.propertyAssertionBlock(object);
}
}
ReferencingObject
そして、これが私のインターフェイス/およびReferencedOutlet
クラスの実装です。
@interface ReferencingObject : NSObject
@property (nonatomic, strong) id object;
@property (nonatomic, strong) NSArray *outlets;
@end
@implementation ReferencingObject
@end
typedef void (^ReferencedOutletPropertyAssertionBlock)(id);
@interface ReferencedOutlet : NSObject
@property (nonatomic, copy) NSString *name;
@property (nonatomic, copy) ReferencedOutletPropertyAssertionBlock propertyAssertionBlock;
@end
@implementation ReferencedOutlet
@end
うまくいけば、この答えがあなたや他の誰かに役立つでしょう。ご不明な点がございましたら、お知らせください。
コンセントがあるかどうかを確認する代わりに、すべてに一意のタグを割り当てます。Interface Builder でボタンを選択し、右側の属性インスペクターに移動します。一番下には、オブジェクトのタグ プロパティを設定するためのボックスがあります。次に、ペン先のビューをステップスルーしながら、それぞれのタグをチェックし、それを使用してそれがどのビューであるかを判断できます。