# Rash thoughts about .NET, C#, F# and Dynamics NAV.

## Saturday, 28. February 2009

### Parameterized Scenarios with NaturalSpec

Filed under: F#,NaturalSpec — Steffen Forkmann at 16:46 Uhr

I wrote a lot about NaturalSpec in my last articles. This time I will show how we can use parameterized scenarios.

##### 1. Using predefined scenarios

By writing predefined parameterized scenarios we can easily create a scenario suite with lots of different test cases:

```// predefined scenario
let factorialScenario x result =
Given x
|> When calculating factorial
|> It should equal result

[<Scenario>]
let When_calculation_factorial_of_1() =
factorialScenario 1 1
|> Verify

[<Scenario>]
let When_calculation_factorial_of_10() =
factorialScenario 10 3628800
|> Verify```

If we run these scenarios with NUnit we will get the following output:

Scenario: When calculation factorial of 1

– Given 1

– When calculating factorial

=> It should equal 1

==> OK

==> Time: 0.0093s

Scenario: When calculation factorial of 10

– Given 10

– When calculating factorial

=> It should equal 3628800

==> OK

==> Time: 0.0018s

##### 2. Using the ScenarioTemplate attribute

The second and shorter option is to use the ScenarioTemplate attribute, which is inherited from NUnitĂ˘â‚¬â„˘s new TestCase attribute:

```// with ScenarioTemplate Attribute
[<ScenarioTemplate(1, 1)>]
[<ScenarioTemplate(2, 2)>]
[<ScenarioTemplate(5, 120)>]
[<ScenarioTemplate(10, 3628800)>]
let When_calculating_fac_(x,result) =
Given x
|> When calculating factorial
|> It should equal result
|> Verify```

This code will create 4 different scenarios, which NUnit will display and report separately: ##### 3. Using ScenarioSource

The third option is to use the ScenarioSource attribute. Here we define a function which generates TestData:

```/// with a scenario source
let MyTestCases =
TestWith 12 3 4
|> And 12 4 3
|> And 12 6 2
|> And 1200 40 30
|> And 0 0 0 |> ShouldFailWith (typeof<System.DivideByZeroException>)```

And then we have to tell NaturalSpec which TestData a scenario should use:

```[<Scenario>]
[<ScenarioSource "MyTestCases">]
let When_dividing a b result =
Given a
|> When dividing_by b
|> It should equal result
|> Verify```
` `
##### Summary

Sometime it makes sense to test a scenario with a bunch of different parameters. We can use the ScenarioTemplate attribute to easily parameterize our scenarios. If we want more flexibility we can use predefined scenarios with custom parameters or the ScenarioSource attribute.

Tags: , , , ,

#### 1 Comment »

1. Does ScenarioSource still work? I can use ScenarioTemplate, but not ScenarioSource.

Comment by Ryan Riley — Wednesday, 20. October 2010 um 1:57 Uhr