A nice feature for a story runner is to be able to provide arguments in a story sentence, like this:
This example is not hard to understand, but there’s some mental translation going on, since the order of the words is all screwed up. Let’s try another one:
Better, but still not good. First, it’s longer than the previous example. Second, even if the grammar is correct, the word order is, well, unusual.. 😉
What about this?
ATableWith 4 Legs
Now we’re talking!
Here’s a bigger and more complete example:
let tableLegsScenario =
given (ATableWith 4 Legs)
|> whens (ICutOf 1 Leg)
|> thens (ItHasOnly 3 LegsLeft)
Note: As far as I know, RSpec/Cucumber is the only story runner(s) that is able to use variables inside a story sentence.
The nice thing about this is that I didn’t have to change FsStory itself to make it work. Not a single line. So, what’s the trick?
If you split up a story sentence like this, you have to prepare the step definition code (the behind-the-scenes code) in a certain way:
let ATableWith = fun n _ -> … do something here …
..or if you prefer, without a lambda:
let ATableWith n _ = … do something here …
Then you have to define Legs:
let Legs = id
As you see, in this case, it was just a matter of discovering the usage, rather than implementing it in the language. Honestly, I had no idea of this usage when I started to write on FsStory. This is clearly one of the reasons why I like internal DSLs!
Exercise: How would you implement the step definition for the following story sentence?
given (ATableWith 4 LegsAnd 2 Chairs)