I found a solution to the problem I was having with WP_Query. What I was missing was the offset (which I did not realize needed to be set when dealing with custom queries).
First: Get the current page
// If the query var is set use it; otherwise, initialize it to one.
$page = get_query_var( 'paged' ) ? get_query_var( 'paged' ) : 1;
Second: Write the query
// First, initialize how many posts to render per page
$display_count = 2;
// Next, get the current page
$page = get_query_var( 'paged' ) ? get_query_var( 'paged' ) : 1;
// After that, calculate the offset
$offset = ( $page - 1 ) * $display_count;
// Finally, we'll set the query arguments and instantiate WP_Query
$query_args = array(
'post_type' => 'post',
'orderby' => 'date',
'order' => 'desc',
'number' => $display_count,
'page' => $page,
'offset' => $offset
);
$custom_query = new WP_Query ( $query_args );
/*
* Use your query here. Remember that if you make a call to $custom->the_post()
* you'll need to reset the post data after the loop by calling wp_reset_postdata().
*/
Source: Tom McFarlin