Skip to content

Further testing my OCMock contributions - block invocation arg constraints.

License

Notifications You must be signed in to change notification settings

cloudhm/ocmock-block-tests

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

18 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

OCMock - Block Testing

### Features

  • [OCMArg invokeBlock]

    • A constraint specific to block arguments.
    • It auto-invokes the block with default values for each of its arguments.
    • E.g. OCMStub([uiView animateWithDuration:0.4 animations:[OCMArg invokeBlock] completion:[OCMArg invokeBlock]]).
  • [OCMArg invokeBlockWithArgs:...]

    • A constraint specific to block arguments.
    • It auto-invokes the block with the given values for each of its arguments.
    • The number of arguments passed in the vargs must match the number of arguments that the block takes.
    • The type of the arguments passed in the vargs must be compatible with the types of the arguments that the block takes.
    • Argument values which are not Objective-C objects (e.g. primitives, structs, pointers) must be boxed in NSValue.
    • Use OCMOCK_VALUE to do this conveniently.
    • Pass OCMDefault in the vargs to invoke the block with a default argument.
    • List of arguments must be nil-terminated.
    • Note that it requires additional parentheses when used in an OCMStub macro to avoid the vargs being parsed as separate macro arguments.
    • E.g. OCMStub([obj doSomethingComplexCompletionBlock:([OCMArg invokeBlockWithArgs:@"A first param", @123, OCMOCK_VALUE(somePtr), OCMDefault, nil])])

### Use Cases

Tests

  • This repo contains 2 test harnesses:

    • Strange Types, which tests these features out with all sorts of obscure block signatures,
    • A sample application taken from BetweenKit, which aims to demonstrate how this feature might be used in the real world.
  • All tests have passed on the following:

    • iPhone 6, iOS 8.3
    • iPad Mini, iOS 8.1
    • iPad 2, iOS 8.3
    • iPad 2 Simulator, iOS 7.1, iOS 8.1, iOS 8.4
    • iPad Retina Simulator, iOS 7.1, iOS 8.1, iOS 8.4
  • Tests in my OCMock fork have passed on the following:

    • Macbook Pro, Retina 15", OS X Yosemite 10.10.4

### Limitations

  • This relies on NSInvocation to invoke the blocks and as a result, does not support va_lists or unions as arguments.
  • This has not been tested with function pointers as block arguments.
  • OCMBlockArgCaller is quite strict: it will throw if the type signature of a given argument doesn't match the type signature of the block (to offer as much feedback as possible to the user).

### References

About

Further testing my OCMock contributions - block invocation arg constraints.

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages

  • Objective-C 98.3%
  • Shell 1.6%
  • Ruby 0.1%