iOSの標準フレームワークでは至るところにBlocksが登場します。 引数として渡されるBlocks自体に制限を設けたテストを書くことはあまりないので [OCMArg any]を指定しようと考えるのですが、Blocksは内部的にcopyして扱われることが多いらしく、 以下のようなテストを書くとOCMConstraintをcopyしようとしたところで例外が発生します。 OCMConstraintがNSCopyingに適合していないので当然のことですが、ちょっと困ります。

- (void)testSomeMethod
{
    id mock = [OCMockObject partialMockForObject:viewController];
    [[mock expect] dismissViewControllerAnimated:NO completion:[OCMArg any]];

    // 何かする

    STAssertNoThrow([mock verify], @"did not dismiss.");
}

めんどくさいので自分は以下のようなコードをOCMConstraintのカテゴリに書いて問題を回避しました。

- (id)copyWithZone:(NSZone *)zone
{
    return self;
}

テストコードとは言えどもこういった雑なことばっかりしてるといつか痛い目に遭いそうだと思ったので、 より良い方法があれば聞きたいところです。

追記

OCMock 2.2では同様の実装がされていると、@azu_reさんに教えていただきました。
2.2以降を利用すれば上記のメソッドを実装しなくてもcopyの問題は起こりません。