C# - Test A MVC2 Post Action With Validation When Using MvcContrib TestHelper?
Oct 12, 2010
I'm attempting to write a unit tests for an ASP.NET MVC 2 post action that takes a view model as its sole parameter. The view model is decorated with validation attributes such as [Required]. I'd like to test two scenarios. The first scenario is when a valid set of data is passed in (ie, all required properties have values) and a redirect to the list page is returned. The second scenario involves passing in invalid data (eg, when one or more of the Required properties are not set). In this case the same view is returned with error messages.The action signature is as follows:
[HttpPost]
public virtual ActionResult Create(NewsViewModel model)
The NewsViewModel class is as follows:
public class NewsViewModel
{
public Guid Id { get; set; }
I'm trying to get my route tests going using MvcContrib.TestHelper and MsUnit. This is what I got: (Pretty much straight out of MVC 2 in Action, Chapter 26, Testing Practices. Just I *have* to use msUnit, while the book use nUnit)
[Code]....
However I get an error saying : MvcContribTestHelperSandbox.Tests.Controllers.RouteTests.Setup has wrong signature. The method should be marked .. [rest is just cut off...not nice!) When I tried runnig it without the setup, I get some error complaining about a wrong version of Rhino Mocks, which I'm not even using! (Intend to add a reference to Moq.dll when I need to do mocking)
In my Asp.net MVC app, I have two methods on a controller, one for when the user first arrives on the view and then one when they submit the form on said view.
public ActionResult Foo() {} [AcceptVerbs(HttpVerbs.Post)] public ActionResult Foo(string id, Account accountToFoo) {}
In the second action, there's a custom model binder that's assembling the account object that I'm acting on, though that's really not important. This all works fine in testing locally on a server.We try to be pretty good about writing unit tests to test all our different views are properly getting routed to, including those that are HTTP POST. To do so, we've been using mvccontrib's test helper.
My question is in testing POST routes, how do I write the lambda that I would use to verify the post is receiving accurate values, similar to the GET test above?
It's the something_something portion of my lambda that I'm having trouble with. Using arbitrary values doesn't work ("a => a.Foo(0, new Account()"). How would I specify the expected values as part of the test?EDIT I was hoping there was something akin to the way Moq has lambdas for statements such as foo.Setup(s => s.Foo(It.IsAny(), It.Is(i => i > 32)) and so on. Even I have to explicitly supply the values, that's workable--I just can't seem to grok the desired structure to pass those explicit values.
Lets say I have a simple controller for ASP.NET MVC I want to test. I want to test that a controller action (Foo, in this case) simply returns a link to another action (Bar, in this case).How would you test TestController.Foo? (either the first or second link)
My implementation has the same link twice. One passes the url throw ViewData[]. This seems more testable to me, as I can check the ViewData collection returned from Foo(). Even this way though, I don't know how to validate the url itself without making dependencies on routing.The controller:
public class TestController : Controller { public ActionResult Foo()[code].....
I'm trying to add file upload functionality to a page. I've got a form that posts the selected file to a controller with a 'savefile' method. But if I don't add a get version of 'savefile' I'll get a 404 error. Here is the form code which is presented on the Index page:
[Code]....
And here is the controller code:
[Code]....
Intuitively I don't think I should need a GET version of SaveFile but if omit it I get a 404 error when the form posts. Why should I need a GET version of SaveFile when all I want is to post a form and save the file?
How can I unit test an action which alters the Http Response object? I haven't been able to solve this. I can mock the object but can't see how I can check the value after the action runs. I set the Response.StatusCode when errors occur in ajax requests and need to check it has been set in the unit test. The only alternative I can see is to change all my actions to return json objects with a IsSuccessful flag or similar.
I have a custom actionfilter that strips out the whitespaces before the html is rendered in browser and it is working fine. However I have been unable to unit test the custom action filter. Ideally I want to do an assert on the sample html that all whitespaces have been removed. Code looks something like this.
I have a /Register [GET] Action in the controller that pre-poluates a view-model with a string and an integer and returns: return View(myModel);I can see the string being populated in the textarea and the id being populated in a hidden input. Yet when the form gets POSTed, the string value is null and the int value is 0. I verified that both values are posted to the server but the model received in the POST action is missing those values.
I'm just starting to use the TestHelpers in MvcContrib. I want to try and test an action method on my controller that itself tests if IsAjaxRequest() is true. I've used the same code that is shown in the TestHelper samples to set up the TestControllerBuilder
_controller = new StarsController(); _builder = new TestControllerBuilder(); _builder.InitializeController(_controller);
So that _controller has all the faked/mocked HttpContext inside it, which is really great. But what do I do now to force IsAjaxRequest() on the internally faked Request object to return true?
//[Validator(typeof(MandateValidator))] [MetadataType(typeof(Mandate_Metadata))] public partial class Mandate { public class Mandate_Metadata {.........
I am using MVC 2 with Entity Framework 4 models and MetadataType classes to create annotations that do not vanish everytime my model is generated... I followed Scott's article to create that.It worked fine for simple classes, but when I got to a more complex one, with regular expression and range validations on doubles, it seemed to simply ignore the validation annotations altogether.
I am working on form, which send input to webservice via post and display result. It must be simple, and it works fine on localhost. But when I try to use it agains live I have error 500.
I am trying to make some sense of this validation stuff in MVC2. I followed various walkthroughs, all them for betas/rcs... and I cant' get anythign to happen. Note: THIS JQUERY - NOT THE MS AJAX STUFF!I have referenced MicrosoftMvcJQueryValidation.js which i got got the mvc2 futures lib.
My model is:
[Code]....
The form bit of my ViewPage<User>:
[Code]....
As far as I can see the only additional thing that is being rendered is this:
[Code]....
Which is interesting/annoying for a few reasons. Firstly all of my annotations appear to have been ignored.Secondly FormId isn't even marked as required, and as this rendered text was taken from a page loaded with a null Model (add mode) the FormId field isn't in the form. Finally, this doesn't even result in any actual validation occuring (on the client side). All the server side validation is working fine.See I am using PasswordFor instead of EditorFor. Because someone at MS testing dropped the ball there. Yes EditorFor renders a password field, but it behaves differently to PasswordFor.. the value of the Password field is sent to the client (set in the value attribute of the field). Fail.
Whilst my validation is successful/fine with this control (ValidationMessageFor works) I have been unable to find how to highlight the control when validation fails (e.g. with a TextBoxFor the textbox border goes red if validation fails)
Does anyone know how I can add this behaviour with a custom editor template?
@using (Html.BeginForm("Index", "Bill")) { @Html.Label("FromDate") @Html.DropDownList("FromDate",Model.DateList) @Html.Label("ToDate") @Html.DropDownList("ToDate", Model.DateList) @Html.ActionLink("Filter", "Index", "Bill") // I want to post to Index } [HttpPost] public ActionResult Index(string fromDate, string toDate) { //Process }
What is the correct way to post the date range to Index action?
I am trying to save user feedback by using jquery to post to an action however i am getting the error message "Failed to load source for: http://www.something.com/feedback/savefeedback" this code works fine on localhost but not when put on my shared hosting, this doesnt just affect this query post but also at least one other.
below i have the route from the global.ascx, the action int the FeedBackController and the query that does the post.
routes.MapRoute( "FeedBack", // Route name "FeedBack/{action}", // URL with parameters [code]....
i wonder something about mvc post method. for example I created a view "strongly typed" from a model (MyModel).
<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<Demo1.Models.MyModel>" %> for Create actionsthere is two way. first one takes MyModel as parameter [HttpPost] public ActionResult cart(MyModel md, int someID) { //some code //..... return View(MyModel); } second one does not take parameter as model. [HttpPost] public ActionResult cart(int someID) { //some code //..... return View(Mymodel); }
for first one way, after form post the form values does not delete, I mean form does not cleared,after second one form is be cleared. why this diffirence?
I'm trying to use the jQuery.post() function to post an object to an action method, but for some reason the nested objects aren't initialised properly when they're received by the action method.
Here's my javascript code:
[Code]....
And my action method:
[Code]....
company.Id has a value of 10, but company.User.Id is 0. what I'm doing wrong? I've not named any properties incorrectly, by the way.
I must miss something obvious here when using htmlbegin form. I noticed that it takes (or tries to take me) right to the view rather than the an action. If I replace SearchAction with SearchResult is goes nicely to the view, not considering the action.
Using SeachAction leads to the error that it cant find the view.
I have an ActionResult that accepts POST, however is there a work around for me to redirect from a controller to another controller containing this POST method/action?
We have an ASP.Net page that uses a checkbox to toggle between a list view and a tree view. The problem is that this triggers a post. When we then click on one of the documents in the list, then press back in the browser, we get a page expired error. Is it possible to change the action of the check box to trigger a get with a parameter?