Hidden files are no longer accessible with AJAX in Craft 3
My guess is still: you did not define a route correct route for your template. You can check if you can access the file when you call the route normally via url www.example.com/blog/test if you can see the template, then it should usually work, if not you did not define any routing rules see here

However: when you do it that way everyone with the link may see this template and I expect it to look not very good without content since it's probably only a partial, so I would highly recommend you to use the proper way via controller.

public function actionRenderTemplate(){
    $response = [
        'success'   =&gt; false,
        'message'   =&gt; 'something went wrong'
    ];
    if($template = Craft::$app-&gt;getRequest()-&gt;getBodyParam('template')){
        try{
            $response['success'] = true;
            $response['html'] = Craft::$app-&gt;getView()-&gt;renderTemplate($template, [
                'foo' =&gt; Craft::$app-&gt;getRequest()-&gt;getBodyParam('just an example to pass values');
            ]);
        }catch(\Twig_Error_Loader $e){
            $response['message'] = $e-&gt;getMessage(); 
        }catch(\yii\base\Exception $e){
            $response['message'] = $e-&gt;getMessage();
        }
    }
    return $this-&gt;asJson($response);
}


And your javascript

$.ajax({
    type: "post",
    data: {
        action: 'plugin-handle/controller/render-template',
        template: 'path/to/template'
    },
    url: '',
    success: function (data) {
        if (data.success === true) {
            // do your stuff
            $('body').append(data.html);
        } else {
            // something went wrong
            // show a message or whatever
        }
    }
});


Edit
Please make sure you are in the correct folder for rendering your template, there is a difference between frontend and cp requests docs that's why we always build a custom template service that checks if there is a template in the normal path first and only takes the plugin template if there is none so we can overwrite plugin templates if needed and don't need to check/overwrite the paths every time