On 18 Dec 2011, at 21:41, Henrique Prange wrote:
> Hi Kevin,
>
> I'm not an expert on ERXValidation, but you're correct. The ERXLocalizer
> class has not been initialized properly. Unfortunately, WOUnit doesn't load
> the Properties file before the test execution as well as it doesn't provide
> means for the ERXLocalizer to initialize properly. As a workaround, you can
> manually load the Properties file and initialize the ERXLocalizer in a static
> method annotated with @BeforeClass.
I poked around to see what ERXExtensions was doing to load the properties and
setup ValidationTemplates and came up with:
@Before
public void setup() {
//ERXProperties.populateSystemProperties();
ERXLocalizer.initialize();
ERXValidationFactory.defaultFactory().configureFactory();
}
Then I realized that WOUnit actually loads ERExtensions which should already be
doing this (and is according to ERXLocalization.isLocalizationInitialized). So
there is some other piece that is not fully setup.
>
> I've created two issues [1] [2] and will take a closer look at this
> requirement.
Thanks Henrique. The "exception" is not actually an exception. I can still do:
confirm(account, cannotBeSavedBecause("InvalidEmailException"));
It looks like ERXValidationFactory does the following in it's
templateForEntityPropertyType method because it was unable to find a template.
template = UNDEFINED_VALIDATION_TEMPLATE + " entity \"" + entityName + "\"
property \"" + property + "\" type \"" + type + "\" target language \"" +
targetLanguage + "\"";
log.error(template, new Throwable());
This then led me as far as the valueForKeyPath method in ERXLocalizer returning
null for the template.
So I can match on the validation template key name but not the value. Come to
think of it, this may actually make more sense when unit testing, otherwise I'd
be having to look for different string values depending on the language setup.
I'll call it a night here and take another look at this sometime during the
week. Or not at all, since it may actually make more sense the way it is.
>
> [1]https://github.com/hprange/wounit/issues/24
> [2]https://github.com/hprange/wounit/issues/25
>
> Cheers,
>
> Henrique
>
> On 15/12/2011, at 17:15, Kevin Hinkson wrote:
>
>> Hi everyone,
>>
>> I have a model framework that I am currently testing using WOUnit. For the
>> Account EO I have a unit test to ensure that the email attribute is valid
>> before saving. That worked fine until I started changing the code to be
>> localizable.
>>
>> I have a ValidationTemplate.strings in the framework under Resources ->
>> English.lproj -> ValidationTemplate.strings
>>
>> Values in the template
>> {
>> "EmailFormatException" = "A valid <b>@@displayNameForProperty@@</b> is
>> required.";
>> "Account.email.EmailFormatException" =
>> "<b>@@displayNameForProperty@@</b> must be a valid email address.";
>> }
>>
>> Properties set:
>>
>> # Localization
>> er.extensions.ERXLocalizer.defaultLanguage=English
>> er.extensions.ERXLocalizer.fileNamesToWatch=("Localizable.strings","ValidationTemplate.strings")
>> er.extensions.ERXLocalizer.availableLanguages=(English)
>> er.extensions.ERXLocalizer.frameworkSearchPath=(app,ERDirectToWeb,ERExtensions)
>> er.extensions.ERXLocalizer.useLocalizedFormatters=true
>>
>>
>> Validation code:
>>
>> public String validateEmail(String newEmail) {
>> ERXValidationFactory factory =
>> ERXValidationFactory.defaultFactory();
>>
>> if (!Account.isValidEmail(newEmail)) {
>> ERXValidationException exception =
>> factory.createCustomException(this, Account.EMAIL_KEY, newEmail,
>> "EmailFormatException");
>> throw exception;
>> }
>>
>> return newEmail;
>> }
>>
>> When I run the unit test for the Account EO I get a stack trace in the logs:
>>
>> - Undefined Validation Template entity "Account" property
>> "EmailFormatException" type "CustomMethodException" target language "English"
>> java.lang.Throwable
>> at
>> er.extensions.validation.ERXValidationFactory.templateForEntityPropertyType(ERXValidationFactory.java:554)
>> at
>> er.extensions.validation.ERXValidationFactory.templateForException(ERXValidationFactory.java:448)
>> at
>> er.extensions.validation.ERXValidationFactory.messageForException(ERXValidationFactory.java:394)
>> at
>> er.extensions.validation.ERXValidationException.getMessage(ERXValidationException.java:133)
>> at
>> com.wounit.matchers.CanBeSavedMatcher.describeTo(CanBeSavedMatcher.java:53)
>> at
>> org.hamcrest.BaseDescription.appendDescriptionOf(BaseDescription.java:21)
>> at com.wounit.matchers.EOAssert.confirmImplementation(EOAssert.java:253)
>> at com.wounit.matchers.EOAssert.confirm(EOAssert.java:216)
>> at
>> com.coralstone.envoy.modeltests.AccountTest.cannotSaveInvalidEmail(AccountTest.java:61)
>> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>> at
>> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
>> at
>> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
>> at java.lang.reflect.Method.invoke(Method.java:597)
>> at
>> org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
>> at
>> org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
>> at
>> org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
>> at
>> org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
>> at
>> com.wounit.rules.AbstractEditingContextRule$1.evaluate(AbstractEditingContextRule.java:141)
>> at
>> org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:76)
>> at
>> org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
>> at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193)
>> at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52)
>> at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191)
>> at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42)
>> at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184)
>> at org.junit.runners.ParentRunner.run(ParentRunner.java:236)
>> at
>> org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
>> at
>> org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
>> at
>> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
>> at
>> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
>> at
>> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
>> at
>> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
>>
>>
>> It looks to me as if maybe the validation template cannot be found but I'm
>> not certain what would cause that. Possibly there is something I need to
>> load before running the test? Does anyone know what that might be?
>>
>> — Kevin Hinkson.
>>
>> _______________________________________________
>> Do not post admin requests to the list. They will be ignored.
>> Webobjects-dev mailing list ([email protected])
>> Help/Unsubscribe/Update your Subscription:
>> http://lists.apple.com/mailman/options/webobjects-dev/hprange%40gmail.com
>>
>> This email sent to [email protected]
>
— K.R.H.
+1.246.262.8567
_______________________________________________
Do not post admin requests to the list. They will be ignored.
Webobjects-dev mailing list ([email protected])
Help/Unsubscribe/Update your Subscription:
http://lists.apple.com/mailman/options/webobjects-dev/archive%40mail-archive.com
This email sent to [email protected]