By default posting form data from a SilverStripe unit test seems to restrict your POST data to only valid values. Meaning, if you want to post a value for a select field on the form, the value must be in the options for that select field in order for it to be POST'd. [ad#Half Banner] Usually when submitting form data from a unit test its easiest to use the FunctionalTest->submitForm() function with something like:
$this->get(Director::makeRelative($page->Link()));
$this->submitForm('Form_SomeForm', null, array(
'Quantity' => 1
));
But, for sending any POST data you like to a form the easiest way I have found is to grab the existing form data in an array format and then use FunctionalTest->post() to send that data, that way you can set any values you like in the data array, e.g:
/**
* Helper to get data from a form.
*
* @param String $formID
* @return Array
*/
function getFormData($formID) {
$page = $this->mainSession->lastPage();
$data = array();
if ($page) {
$form = $page->getFormById($formID);
if (!$form) user_error("Function getFormData() failed to find the form {$formID}", E_USER_ERROR);
foreach ($form->_widgets as $widget) {
$fieldName = $widget->getName();
$fieldValue = $widget->getValue();
$data[$fieldName] = $fieldValue;
}
}
else user_error("Function getFormData() called when there is no form loaded. Visit the page with the form first", E_USER_ERROR);
return $data;
}
function testSomething() {
$data = $this->getFormData('Form_SomeForm');
$data['SomeFormField'] = 3;
$this->post(
Director::absoluteURL($page->Link()),
$data
);
}
Its not the best method, I'm pretty sure the _widgets variable is intended to be private lol, but it works.