Sending Test Push Notifications from Terminal

When working on a project recently, I needed an easy solution for testing and debugging push notifications. So I wrote a Swift command-line tool…

Read More

Clean Git History without Terminal

Your commits represent and encapsulate your added value to the project you’re working on. They are meant to forever live in the history of your repo.…

Read More

Testing Publishers Synchronously with a Blocking Recorder

When releasing Combine, Apple didn’t show us what their vision for testing the codebase with Combine was. Surely they must have thought about it.

Read More

iOS Code Review #2: Adding Tests to an Existing App (Networking)

Adding tests to an existing app can be challenging and sometimes intimidating. In this episode of iOS Code Review, I go through the process…

Read More

Building a Custom XCTAssert for Multiline Strings

XCTest provides a bunch of XCTAssert... functions to be used for assertions in your tests. Sometimes, however, the functionality you need is…

Read More

Why You Should Be Using `unowned` More Often

I’ve seen a lot of interesting codebases in the last two months: new clients of Industrial Binaries, submissions for my iOS Code Review series, and…

Read More

Mocking Network Calls Using URLProtocol

For many apps, the networking code is one of the most important parts of the whole codebase. Yet it’s also a part which is quite difficult to test…

Read More

iOS Code Review #1: A Simple Weather App

I decided to try something new and recorded a YouTube video. This is the first video of the iOS Code Review series I’d like to do. In this series I’m…

Read More

Advanced testing using `Behavior` in Quick

Behavior is a hidden gem in the Quick testing framework. It was introduced silently in 2017 and it’s not even mentioned in the documentation! The…

Read More

What’s inside the Derived Data folder?

Deleting derived data - a well know trick that comes in handy every time Xcode behaves strangely for no obvious reason. I still clearly remember when…

Read More