• I’m trying to test the markup in Unit Test and I’ve encountered an issue where get_header doesn’t get rendered the second test which causes the tests to break.

    Here’s how I capture the markup from template

    protected function get_view_output_as_dom( $path ) {
    		ob_start();
    		$this->go_to( $path );
    		$this->load_template();
    		$output = ob_get_contents();
    		ob_end_clean();
    
    		error_log( "Noppanit", 3, "/var/tmp/my-errors.log");
    		error_log( $output, 3, "/var/tmp/my-errors.log");
    
    		$html5 = new HTML5();
    		$dom = $html5->loadHTML($output);
    
    		return $dom;
    	}
    
    	/**
    	 * Copy-pasta of wp-includes/template-loader.php
    	 */
    	protected function load_template() {
    		do_action( 'template_redirect' );
    
    		$template = false;
    		if	 ( is_404()			&& $template = get_404_template()			) :
    		elseif ( is_search()		 && $template = get_search_template()		 ) :
    		elseif ( is_front_page()	 && $template = get_front_page_template()	 ) :
    		elseif ( is_home()		   && $template = get_home_template()		   ) :
    		elseif ( is_post_type_archive() && $template = get_post_type_archive_template() ) :
    		elseif ( is_tax()			&& $template = get_taxonomy_template()	   ) :
    		elseif ( is_attachment()	 && $template = get_attachment_template()	 ) :
    			remove_filter('the_content', 'prepend_attachment');
    		elseif ( is_single()		 && $template = get_single_template()		 ) :
    		elseif ( is_page()		   && $template = get_page_template()		   ) :
    		elseif ( is_category()	   && $template = get_category_template()	   ) :
    		elseif ( is_tag()			&& $template = get_tag_template()			) :
    		elseif ( is_author()		 && $template = get_author_template()		 ) :
    		elseif ( is_date()		   && $template = get_date_template()		   ) :
    		elseif ( is_archive()		&& $template = get_archive_template()		) :
    		elseif ( is_comments_popup() && $template = get_comments_popup_template() ) :
    		elseif ( is_paged()		  && $template = get_paged_template()		  ) :
    		else :
    			$template = get_index_template();
    		endif;
    		/**
    		 * Filter the path of the current template before including it.
    		 *
    		 * @since 3.0.0
    		 *
    		 * @param string $template The path of the template to include.
    		 */
    
    		if ( $template = apply_filters( 'template_include', $template ) )
    			include( $template );
    		return;
    	}

    and this is my test

    public function test_facebook_open_graph_tags_for_homepage() {
    		$expected_home_tags = array(
    			'og:title'              => $this->blogname,
    			'og:type'               => 'website',
    			'og:description'        => $this->blogdescription,
    			'og:site_name'          => $this->blogname,
    			'og:url'                => home_url( '/' ),
    			);
    
    		$dom = $this->get_view_output_as_dom( '/' );
    
    		$metas = qp( $dom, 'meta' );
    		$this->assertMetaTags($expected_home_tags, $metas);
    	}
    
    private function assertMetaTags( $expected_tags, $metas ) {
    		$inspector = array();
    		foreach( $expected_tags as $key => $value ) {
    			foreach( $metas as $meta ) {
    				if( $meta->attr( 'property' ) == $key ) {
    					array_push( $inspector, $key );
    					$this->assertEquals( $value, $meta->attr( 'content' ) );
    				}
    			}
    		}
    
    		if( count( $inspector ) != count( $expected_tags ) ) {
    			var_dump( $inspector );
    			$this->fail( 'one or more attributes are missing' );
    		}
    	}

    And the second test is doing the same thing but the second test failed because meta tag doesn’t get rendered because get_header() doesn’t get rendered. I put the content to error_log to see the output and the second test just show the template without get_header and get_footer content

    I’m not sure if I’m missing something obvious.

  • The topic ‘get_header doesn't get rendered twice in unit test’ is closed to new replies.