Some of my recent work has been around improving error handling and logging.
We had some tasks that, if they failed to execute correctly, were supposed to raise exceptions, log themselves, and re-queue, but they were not.
The class in which I was working managed in large part API calls to external services, services that our team has no control over. Sometimes the services work great, sometimes they don’t. The tests for this class made heavy use of mocks, stubs, and the VCR gem.
This post was originally going to be about error handling, but then I realized I was getting a bit crossed up just by the mocks and stubs, so I took a quick detour into the topic, in order to build out a mental model of what was going on.
As I often do, I spun up a bare-bones implementation of all of the required pieces, to see how everything was playing together. One guide I found was excellent, but the sample app was a bit over-kill. I didn’t want a whole new rails app - I just wanted a class and test file.
note: This isn’t a tutorial, per se, but it’s just two files and you can easily copy-paste the code into an editor and run the tests. I’ll link to specific commits in a github repo throughout. Clone it down, check out the commit, poke around.
I mention some books “pair well” with other books, just as certain wines pair well with a certain foods. The ideas contained within certain books may compliment (or contrast) the ideas listed in the “pairs with” book.
I joined the Wombat team a few months ago, and have been working on the threatsim product. We had a bit of a bug backlog, and myself and others have been rapidly whipping it into shape.
ThreatSim is a Ruby on Rails application; any developer out there who works with Rails has probably used Pry extensively in debugging their application. Pry “pauses” your application’s execution and lets you observe and manipulate state, wherever the pry happens to be.
Most pry usage is pretty simple - put a pry in your code, cause that line of code to be executed, and then poke around in the session in your terminal.
For me, this can feel unwieldy when I am trying to do a broad examination of the application. Pry is great at showing me the state of the variables contained within the method that the Pry was placed at, but I don’t always want to see just this code and its variables, I want to skip around the application and peek into different components.
Looking at methods
You can use show-method to reveal pretty much any code in your application. If you use show-method with no arguments, it will show all of the code in the method that you’ve placed the pry.
show-method (with no arguments, shows current class/method location, can be similar to whereami (look at prompt) (I usually append -l to show-method, to add line numbers
A few weeks ago, after Firefox Quantum came out, I decided to give it a go.
Turns out, Firefox is great! It was a near-seamless transition, and Firefox has a much lower memory footprint, as well as features Chrome does not have, like Tracking Protection and Reader View
But something was bothering me to no end. I could not find a keyboard shortcut to toggle the visibility of the bookmarks toolbar.
I take a lot of screenshots throughout the day, and share them within my company. I don’t really want my bookmarks bar taking up space in the screenshot, but I do sometimes need it to find actual bookmarks.
In Chrome, Cmd-Shift-B toggles the bookmarks bar visibility. In Firefox, that combo shows your history.
I recently wrote a rake task to update some values we’ve got stored in the database. The rake task itself isn’t important in this post, but testing it is.
We’ve got many untested rake tasks in the database, so when our senior dev suggested adding a test, I had to build ours from scratch.
I did a bit more whack-a-moling with error messages than I’d hoped, so here’s a template of that test, along with some details that might save you some time, next time you are writing tests for your rake tasks.
We’re in a not-new version of Rails, and using Minitest. I’ve anonymized it. Hope it’s useful!
# test/tasks/rake_task_file_test.rbrequire'test_helper'require'rake'classRakeTaskFileTaskTest<ActiveSupport::TestCasedescribe'namespace:task_name'dodefsetup@tt=Fabricate(:object_with_attributes_i_need_to_change)ApplicationName::Application.load_tasksRake::Task["namespace:task_name"].invokeendit"should change 'thing I don't want'"firstname.lastname@example.orgemail@example.com_i_changedrefute_includesvalues,"thing I don't want"assert_includesvalues,"thing I do want"endendend