public void BestRescueIsSelectedBasedOnTheExactExceptionType()
		{
			ControllerWithMultipleRescues controller = new ControllerWithMultipleRescues();

			IControllerContext context = new DefaultControllerContextFactory().
				Create("", "home", "index3", services.ControllerDescriptorProvider.BuildDescriptor(controller));

			controller.Process(engineContext, context);

			Assert.AreEqual(500, response.StatusCode);
			Assert.AreEqual("Error processing action", response.StatusDescription);
			Assert.AreEqual("rescues\\sqlexception", engStubViewEngineManager.TemplateRendered);
		}
		public void ControllerRescueIsUsed()
		{
			ControllerWithRescue controller = new ControllerWithRescue();

			IControllerContext context = new DefaultControllerContextFactory().
				Create("", "home", "index", services.ControllerDescriptorProvider.BuildDescriptor(controller));

			controller.Process(engineContext, context);

			Assert.AreEqual(500, response.StatusCode);
			Assert.AreEqual("Error processing action", response.StatusDescription);
			Assert.AreEqual("rescues\\generalerror", engStubViewEngineManager.TemplateRendered);
		}
		public void InvokingNonExistingActionResultsIn404()
		{
			var controller = new ControllerAndViews();

			var context = new DefaultControllerContextFactory().
				Create("", "home", "NonExistentAction", new ControllerMetaDescriptor());

			try
			{
				controller.Process(engineContext, context);
			}
			catch(MonoRailException)
			{
				Assert.AreEqual(404, response.StatusCode);

				throw;
			}
		}
		public void FallsBackToExceptionIfNothingMatches()
		{
			ControllerWithSpecializedRescuesOnly controller = new ControllerWithSpecializedRescuesOnly();

			IControllerContext context = new DefaultControllerContextFactory().
				Create("", "home", "index1", services.ControllerDescriptorProvider.BuildDescriptor(controller));

			try
			{
				controller.Process(engineContext, context);
			}
			catch(Exception ex)
			{
				Assert.AreEqual(500, response.StatusCode);
				Assert.AreEqual("Error processing action", response.StatusDescription);
				Assert.AreEqual("Testing", ex.InnerException.Message);

				throw;
			}
		}
		public void FallsBackToGeneralIfNothingMatches()
		{
			var controller = new ControllerWithMultipleRescues();

			var context = new DefaultControllerContextFactory().
				Create("", "home", "index2", services.ControllerDescriptorProvider.BuildDescriptor(controller));

			controller.Process(engineContext, context);

			Assert.AreEqual(500, response.StatusCode);
			Assert.AreEqual("Error processing action", response.StatusDescription);
			Assert.AreEqual("rescues\\generalerror", engStubViewEngineManager.TemplateRendered);
		}