Behat + FuelPHP = RESTful Testing Happiness
If you've been following my recent posts, you know I've been working more lately with Behat for resting some REST services. In this post I showed you how to get things set up for some testing. In this post, I'll show you how to use a custom class that I've put together to make a reusable system for testing REST.
For those that want to cut to the chase, I've posted some example code to github showing the code for the two different sides of the equation - the Behat testing and the PHP framework side (I went with FuelPHP because I was already familiar with it and it makes RESTful interfaces dead simple). The key is in the FeatureContextRest.php file that uses the Guzzle client to make the HTTP requests over to the framework. It provides some handy contexts that make it easy to create Scenarios.
So, still with me? Good - I'll show you how to get my sample scripts installed so you can see my example in action. In the repository you'll find two different directories - a€ofuela€¯ and a€obehata€¯. In each you'll find some files:
An example set of Scenarios that use the REST testing contexts to create, find and deleting a a€oUsera€¯ from the system
The key to the puzzle, the implementation of some context methods for use in Behat
These are the example models and controllers you can drop into your Fuel install to have them a€omagicallya€¯ work (with any recent version of the framework).
- Start by copying over the FeaturesContextRest.php file to the a€ofeatures/bootstrapa€¯ directory of your Behat installation alongside the default FeaturesContext.php.
- Copy over the behat.yml configuration file into your testing root (the same level as the a€ofeaturesa€¯ directory) and update the base_url value for your hostname.
- Take the a€oclassesa€¯ directory and copy over its contents to the location of your FuelPHP installation - if you're familiar with the structure of the framework, this is simplea€¦it just goes in a€oapp/classesa€¯.
- You'll need a database to get this working, so you'll need to get the FuelPHP ORM stuff configured and working in your install. Be sure to update your config.php to automatically load the a€oorma€¯ module.
- Make a database for the project and use the init.sql to create the a€ousersa€¯ table.
- To test and be sure our models/controllers are working right, hit your host in a browser, calling the a€oUsera€¯ action like: a€ohttp://behat-test.localhost:8080/usera€¯. This should call what's in Controller_User::get_index(). It'll probably just return an empty result though, since there's nothing for it to pull.
- To use the FeaturesContextRest.php, be sure that you include that file into your default FeaturesContext.php file and that your class a€oextends FeaturesContextResta€¯.
So, if all has gone well, you have all the pieces in place to get started. Let's start with a sample Scenario to show you how it all works:Scenario: Creating a new User Given that I want to make a new "User" And that its "name" is "Chris" When I request "/user/index.json" Then the response is JSON And the response has a "userId" property And the type of the "userId" property is numeric Then the response status code should be 200
If you've used Mink in the past, so of this will seem familiar. This doesn't use Mink, however, and I've opted to use Guzzle as the client for the backend to replace some of the browser interactions. Really, we don't need all of the fancy interface interaction Mink gives, so this streamlined inte
Truncated by Planet PHP, read more at the original (another 1012 bytes)