diff --git a/lib/view.js b/lib/view.js index d66b4a2d89c..0dbe6a5cc8c 100644 --- a/lib/view.js +++ b/lib/view.js @@ -57,13 +57,13 @@ function View(name, options) { this.name = name; this.root = opts.root; - if (!this.ext && !this.defaultEngine) { + if ((!this.ext || (this.ext === '.' && !opts.engines[this.ext])) && !this.defaultEngine) { throw new Error('No default engine was specified and no extension was provided.'); } var fileName = name; - if (!this.ext) { + if (!this.ext || (this.ext === '.' && !opts.engines[this.ext])) { // get extension from default engine name this.ext = this.defaultEngine[0] !== '.' ? '.' + this.defaultEngine diff --git a/test/app.render.js b/test/app.render.js index bd65ce1035b..770970aeb2d 100644 --- a/test/app.render.js +++ b/test/app.render.js @@ -90,6 +90,18 @@ describe('app', function(){ done(); }); }) + + it('should provide a helpful error when view name ends in a dot', function(done){ + var app = createApp(); + + app.set('views', path.join(__dirname, 'fixtures')) + app.set('view engine', 'tmpl'); + app.render('rawr.', function (err) { + assert.ok(err) + assert.equal(err.message, 'Failed to lookup view "rawr." in views directory "' + path.join(__dirname, 'fixtures') + '"') + done(); + }); + }) }) describe('when an error occurs', function(){