El 15/10/2007, a las 17:01, “David C.” [email protected]
escribió:
Part of this is to separate the programming ‘noise’ from the text, so
if we do head down this path (which remains to be seen) I doubt these
would end up in the same file.
Thinking about this, the only way to really know how all this will
work is to try it out. That is, we can speculate about what users
will do depending on what kind of “interface” we give them, but to
really find out the only way will be to actually put it into practice.
But having to trial these two possibilities isn’t as onerous as it
may sound. You see, if you want to separate the “noise” from the
story then you’re going to need to “compile” it into an intermediate
form anyway. That is, you might start with “source” file, “stories/
foo.story”, that looks like:
Story: …
Scenario: …
Given: …
When: …
Then: …
But you’ll need to “compile” that into something executable at some
point anyway (probably “stories/foo.rb”, or, if you prefer, in a
subdirectory):
Story “…” do
Scenario “…” do
etc…
The programmer then fleshes out the “rb” file, working in a way very
similar to how he/she can work today with describe/it blocks,
starting with the skeleton and gradually adding the block bodies.
If the customer updates the story file then the corresponding Ruby
file should be updated too. I personally hate this kind of fragile
dependency, but it may be a necessary evil. Doing it manually is
error-prone, and I suppose this could be done in an automated fashion
but the tool for doing it would necessarily be relatively “dumb”;
rigorously parsing Ruby is a non-trivial task, so the parser would
have to be “fuzzy”, and I guess that makes that approach error-prone
too. But it seems an inevitable consequence of having non-executable
stories.
Developing a little bit the idea I previously posted, rather than
defining StepMatchers explicitly in this Ruby file it would probably
be nice if the programmer could just write something like:
Given /\A(.+) navigates to (.+)\z/ do |args|
login_as args[0]
get args[1]
end
In other words, that the whole StepMatcher thing be effectively
encapsulated behind the Given, When, Then classes. For a line in the
story file like this:
Given: “admin navigates to user list”
We could start out with a basic skeletal Ruby implementation like this:
“admin navigates to user list”
Given /admin navigates to user list/
And the programmer then customizes the regex and provides a body. The
comment is just a possible idea, so that you can see which story line
the regex was originally based on even after you’ve customized the
regex.
The other thought which occurred to me was that RSpec itself really
has two groups of “customers”. The developers who use RSpec are one
group, and the developers’ customers is the other. If this idea works
then we can provide a developer-friendly interface (.rb files) and a
friendly-to-non-developers interface as well (.story files).
Anyway, just some ideas that I wanted to throw out there.
Cheers,
Wincent