how to test...

I have a not-so-rails process that I’m developing in Rails. The Rails part is all the admin/configuration stuff. the non-so-Rails is what it actually does.

What it does is this: submit a form to a website wait for email report remove attachments do “stuff” with attachments

I’m trying to figure out how I can TEST something like this without pounding away on 100’s of web forms. They are “expensive” to generate and time consuming to wait for them.

right now I’m doing the primate approach of running the entire thing end-to-end and seeing what worked and what didn’t.

Also, along with this comes another question. How do I write to logs for these not-so-Rails processes?

I have a not-so-rails process that I'm developing in Rails. The Rails part is all the admin/configuration stuff. the non-so-Rails is what it actually does.

What it does is this: submit a form to a website wait for email report remove attachments do "stuff" with attachments

I'm trying to figure out how I can TEST something like this without pounding away on 100's of web forms. They are "expensive" to generate and time consuming to wait for them.

Put all the clever stuff is in methods in models (mostly non ActiveRecord models presumably) then your unit tests should be able to test most of it using fake data without having to go off to the third party website or wait for emails and so on. Then you just have to check that the top level hangs together using a few end-to-end tests.

right now I'm doing the primate approach of running the entire thing end-to-end and seeing what worked and what didn't.

Also, along with this comes another question. How do I write to logs for these not-so-Rails processes?

Can't you use the logger in the normal way?

Colin

I have a not-so-rails process that I’m developing in Rails.

The Rails part is all the admin/configuration stuff.

the non-so-Rails is what it actually does.

What it does is this:

submit a form to a website

wait for email report

remove attachments

do “stuff” with attachments

I’m trying to figure out how I can TEST something like this without pounding

away on 100’s of web forms. They are “expensive” to generate and time

consuming to wait for them.

Put all the clever stuff is in methods in models (mostly non

ActiveRecord models presumably) then your unit tests should be able to

test most of it using fake data without having to go off to the third

party website or wait for emails and so on. Then you just have to

check that the top level hangs together using a few end-to-end tests.

Essentially then the two steps of “looking for an email” and “dumping the attachements to files” can’t really be tested as part of any Unit level testing. But I can run through the rest of the content.

Now that I think about it, I suppose I could do something like “look for an email” in a different directory and move it into the INBOX – then I can test the applications execution of looking for an email and extracting the attachments. It’s a little bit of a hack - I’ll never really have a 100% test until I hit these web sites.

right now I’m doing the primate approach of running the entire thing

end-to-end and seeing what worked and what didn’t.

Also, along with this comes another question.

How do I write to logs for these not-so-Rails processes?

Can’t you use the logger in the normal way?

I assume so, but I’m not sure where/how to introduce logging into my modules which is consistent with the Rails framework.

I didn’t really want to create two sets of files for application logging.

> I have a not-so-rails process that I'm developing in Rails. > The Rails part is all the admin/configuration stuff. > the non-so-Rails is what it actually does. > > What it does is this: > submit a form to a website > wait for email report > remove attachments > do "stuff" with attachments > > I'm trying to figure out how I can TEST something like this without > pounding > away on 100's of web forms. They are "expensive" to generate and time > consuming to wait for them.

Put all the clever stuff is in methods in models (mostly non ActiveRecord models presumably) then your unit tests should be able to test most of it using fake data without having to go off to the third party website or wait for emails and so on. Then you just have to check that the top level hangs together using a few end-to-end tests.

Essentially then the two steps of "looking for an email" and "dumping the attachements to files" can't really be tested as part of any Unit level testing. But I can run through the rest of the content. Now that I think about it, I suppose I could do something like "look for an email" in a different directory and move it into the INBOX -- then I can test the applications execution of looking for an email and extracting the attachments. It's a little bit of a hack - I'll never really have a 100% test until I hit these web sites.

By splitting the task up into separate methods in the models you will make it much easier to test and maintain. Your individual method tests can concentrate on exercising that method, firing unusual conditions at it and so on, to give you confidence that each method does everything it is supposed to. This is not a hack, this is the best way to do it. Then, as I said, you just need minimal integration level tests to confirm that the whole system fits together.

> > right now I'm doing the primate approach of running the entire thing > end-to-end and seeing what worked and what didn't. > > Also, along with this comes another question. > How do I write to logs for these not-so-Rails processes?

Can't you use the logger in the normal way?

I assume so, but I'm not sure where/how to introduce logging into my modules which is consistent with the Rails framework. I didn't really want to create two sets of files for application logging.

I meant that you can use the Rails logger to log messages to the standard logs. See section 2.3 of

for how to do this. Also the rest of that guide is well worth digesting, and all the other guides for that matter.

Colin

This is a great site and I’ll be spending some time with it.

I think part of the problem I have is that my application is a “not-so-rails” in that it is:

run from ‘rails runner’ so I’m missing a lot of the Rails environment in many objects that I have created.

I have 7 objects in /lib that are not ActiveRecord objects but use ActiveRecord objects to update data.

The Rails Scaffold is largely there to provide a configuration management interface for this crontab command line process.

So I don’t have the Rails logger inherently in my code.

What approaches can I use to provide this logging into my command line process libraries?

I have never done that. Did you try the process described in the debugging guide for using an alternative logger (section 2.1)?

Colin