Simon's approach worked great for most cases but I kept bumping into different situations that were causing more errors. After spending more time with it and looking at sinon's documentation I think I have a better approach.
Sinon's Fake Timers to the rescue.
describe('When information is entered into the search fields', function () {
it('vents up the search:for:churches command', function () {
var clock = sinon.useFakeTimers();
var executeStub = sinon.stub(App, 'execute');
view = new SearchForm()
view.render();
view.$el.find('input[name=church_name]').val('baptist')
view.$el.find('input[name=zip]').val('61615')
view.$el.find('input[name=zip]').trigger($.Event('keypress'))
clock.tick(200)
expect(executeStub).to.have.been.called
view.close();
PEP.execute.restore()
clock.restore()
});
});