Behavior Driven Development (BDD) with SpecFlow and ASP.NET MVC
Agile, BDD, Development process, Testing March 3rd, 2010Test Driven Development (TDD) has been around for about a decade, and has been mainstream for at least five years now. During this time, TDD practitioners have been gradually changing and refining the methodology, the mindset, and the terminology in an effort to increase its usefulness and avoid some of the problems that newcomers often experience.
The mindset and terminology has shifted so much that some folks have started using a new name for the updated methodology: BDD. Here’s a brief overview*:
- Test Driven Development seeks to improve software quality by getting you to follow an iterative workflow often called red-green-refactor. In theory, it keeps quality high because if any change breaks earlier functionality, you should be notified by way of a failing test. Also, it should help you to make more pragmatic decisions about what code to write, because you only write the simplest code needed to make all your tests pass.
Despite its unfortunate name, it became clear over time that TDD’s greatest potential benefit is not as a technique for testing code or detecting bugs, but in fact as a code design aid, because it provides a precise mechanism for specifying how your code should behave before you get mentally caught up in the actual implementation. However, in reality, I’ve seen many developers still struggle to break free from a test-oriented mindset and continue to amass reams of unit tests that simply exercise every possible code path without usefully describing what this proves or why it represents correct behaviour. This doesn’t aid design, very rarely detects bugs, and yet consumes a huge amount of maintenance time.
- Behaviour Driven Development retains the basic red-green workflow, but dramatically puts the emphasis on specifying behaviours that are understandable to people (often, business domain experts). It addresses questions such as “How much should I specify?” and “How should I organise and name my specifications so they are most useful?”
To do this, BDD says you should elevate your mind to a level of behavioural abstraction above the code implementation. So don’t say “Constructor_Test” or even “Constructor_NullParam _ThrowsArgumentNullException” but instead say “A shipment cannot be created without a recipient address”. The change of emphasis and terminology leads people to write more useful specifications.I won’t focus on the term BDD itself, because the term is not hugely useful: nobody has ever given it a precise definition as far as I’m aware, and there isn’t a lot of consensus about what it should mean (some say it should only be about the UI; others say not). Instead, in this blog post, I’m going to focus on the major tools that have come out of the BDD stable and the advantages they can give you.
Unit level or UI level?
You can write BDD-style specifications about individual code units, in which case you’ll probably use a context/specification style framework like RSpec (for Ruby) or in .NET something like MSpec or SpecUnit (personally, I don’t like either). Unit-level specifications work brilliantly for most code that ultimately exposes an API for other code. But personally, I spend most of my time writing UI code, usually with ASP.NET MVC, and UI code is fundamentally different. It isn’t about producing an API – it’s about producing user experience (UX) behaviours. These behaviours typically aren’t atomic (contained within a single click or HTTP request); their essence exists only across a sequence of interactions. As such, unit-level specifications can fall short and fail to capture the UI behaviours you have in mind. I wrote before about why, in real projects, I’ve found unit tests to be of limited value for ASP.NET MVC controllers.
Alternatively, you can write BDD-style specifications about UI interactions. Assuming you’re building a web application, you’ll probably use a browser automation library like WatiR/WatiN or Selenium, and script it either using one of the frameworks I just mentioned, or a given/when/then tool such as Cucumber (for Ruby) or SpecFlow (for .NET). In this blog post, I’ll describe these tools and provide an example based on ASP.NET MVC.
* I don’t claim to be an authority on BDD, so if you think I’ve got this all wrong, I invite you to come along and tell me what I’ve misunderstood. Try to be specific, please. My existing understanding is based on having done a lot of TDD, seeing its limitations especially in large teams, and recognising that some of these BDD ideas look like they could help with that.
So, what’s Cucumber?
Cucumber is a Ruby tool that offers a natural-language way to specify behaviours in terms of “Given, When, Then” (GWT) sentence fragments. This language is called Gherkin. You create a plain-text file (called a “.feature” file) containing a set of scenario definitions written in Gherkin, for example
Scenario: Show logged in user name Given I am logged in as a user called "Steve" When I visit the homepage Then the page header displays the caption "Hello, Steve!"
… and also provide Ruby scripts that define what the runner should do when it hits matching steps, for example
Given /I am logged in as a user called "(.*)"/ do |name| create_user(name) sign_in_as(name) end ... Then /the page header displays the caption "(.*)"/ do |caption| page_header.should_contain(caption) end
The syntax is extremely flexible: Cucumber only cares about the Gherkin keywords “Given”, “When”, “Then”, “And” (plus a few others); everything else is simply matched against your regular expressions. Any tokens captured by capture groups in your regexes are passed to your step definition blocks as parameters. For web applications, it’s normal for your step definitions to work by using a browser automation library such as WatiN/WatiR or Selenium.
When you invoke Cucumber, it finds, parses and runs your .feature files, reporting the results (success in green, pending in yellow, failure in red):
![]()
Because the GWT model inherently describes sequences of interactions, and because natural-language .feature files are inherently decoupled from the implementation code (they don’t mention the name of any classes or methods), this whole approach is a perfect fit for UI automation rather than unit-level testing.
Because you can describe scenarios in the language of your domain and user interface, your resulting feature files should make perfect sense to business experts. So, unlike traditional unit test driven development, this methodology can finally deliver on the promise of executable specifications that are actually useful as documentation.
Doing it in .NET with SpecFlow
![]()
As I mentioned, Cucumber itself is a Ruby tool. At the end of this blog post I’ll discuss some options for running the original Cucumber tool in a .NET environment, but for now let’s forget about that - you can sidestep all that complexity with SpecFlow.
SpecFlow is an open-source .NET tool that lets you write specifications using 100%-Cucumber-compatible Gherkin syntax, and has a number of advantages over Cucumber itself:
- It integrates with Visual Studio, which means you get File->New templates for creating new feature files
- More crucially, it gives complete VS debugger support, so you can set breakpoints on Given/When/Then lines in your .feature files and step through their execution
- You can implement your step definitions in any .NET language
- When you compile a project containing SpecFlow feature files, the output is an NUnit test assembly, so you can use your favourite NUnit-compatible test runner or existing CI infrastructure to run the specifications with no additional configuration.
- It doesn’t have such a ridiculous name
It’s sad, but at one of my recent clients, several managers refused to take Cucumber seriously and wouldn’t pay attention to Cucumber specifications purely because of the name. That’s the real world for you!
Example: Combining ASP.NET MVC, SpecFlow, and WatiN
To give you something concrete to get started with, I’ve made a very simple ASP.NET MVC 2 example application, built following the BDD workflow and with a full set of specs. To try it out,
- First download and install SpecFlow (choose either the VS2008 or VS2010 version)
- Download and open the Guestbook source code from Github
- Compile and open Guestbook.Spec.dll in NUnit GUI
You should easily be able to understand in high-level terms what the application does by reading the Gherkin specifications. Just imagine these specifications are the written result of a design meeting where you’ve got your client or boss to tell you how the user interactions should work.
Feature: Browsing
In order to see who's been on the site
As a user
I want to be able to view the list of posts
Scenario: Navigation to homepage
When I navigate to /Guestbook
Then I should be on the guestbook page
Scenario: Viewing existing entries
Given I am on the guestbook page
Then I should see a list of guestbook entries
And guestbook entries have an author
And guestbook entries have a posted date
And guestbook entries have a comment
Feature: Posting
In order to express my views
As a user
I want to be able to post entries into the guestbook
Scenario: Navigation to posting page
Given I am on the guestbook page
Then I should see a button labelled "Post a New Entry"
When I click the button labelled "Post a New Entry"
Then I am on the posting page
Scenario: Viewing the posting page
Given I am on the posting page
Then I should see a field labelled "Your name"
And I should see a field labelled "Your comment"
Scenario: Posting a valid entry
Given I am on the posting page
And I have filled out the form as follows
| Label | Value |
| Your name | Jakob |
| Your comment | Das ist gut! |
When I click the button labelled "Post"
Then I should be on the guestbook page
And I see the flash message "Thanks for posting!"
And the guestbook entries includes the following
| Name | Comment | Posted date |
| Jakob | Das ist gut! | (within last minute) |
Whenever you hit save while editing one of these files, SpecFlow generates a C# NUnit test fixture containing a [Test] method for each scenario. You don’t have to know or care about that, though. All you have to do is create step definitions in C# to match the lines in the Gherkin files.
At first, you won’t have any matching step definitions, so the NUnit test runner will show the tests as “inconclusive”:
![]()
Notice that in the “Text Output” tab it provides C# stub code to create a matching step definition. Here’s some examples of the finished step definitions, written using WatiN to automate a browser:
[When(@"I navigate to (.*)")] public void WhenINavigateTo(string relativeUrl) { var rootUrl = new Uri(ConfigurationManager.AppSettings["RootUrl"]); var absoluteUrl = new Uri(rootUrl, relativeUrl); WebBrowser.Current.GoTo(absoluteUrl); } [Then(@"I see the flash message ""(.*)""")] public void ThenISeeTheFlashMessage(string message) { var flashElement = WebBrowser.Current.Element("flashMessage"); Assert.That(flashElement.Text, Is.EqualTo(message)); } [Given(@"I have filled out the form as follows")] public void GivenIHaveFilledOutTheFormAsFollows(TechTalk.SpecFlow.Table table) { foreach (var row in table.Rows) { var labelText = row["Label"] + ":"; var value = row["Value"]; WebBrowser.Current.TextFields.First(Find.ByLabelText(labelText)).TypeText(value); } }
There’s lots more I could say about WatiN syntax and Gherkin best practices, but this is a pretty long post already so I’ll leave that to others.
In case anyone’s wondering, I’m not trying to claim with this post that Cucumber-style UI automation tests are the one true way to do BDD, or that unit testing is dead. UI automation tends to be much more difficult to do than unit-level tests, because there are many more moving parts and you have to concern yourself with test data, setup and teardown, etc. Seriously, it is hard work, and requires a lot more persistence and dedication than mere unit testing, though it can also give many extra benefits especially with regard to detecting regressions.
What about Running Cucumber Itself on .NET?
If, for some reason, you don’t want to use SpecFlow and would rather run the original Ruby-based Cucumber tool, there are two main options for .NET programmers:
- Use IronRuby. The current version of IronRuby is entirely capable of running Cucumber. It isn’t as easy to set up as SpecFlow, but only took me 30 minutes or so. The drawbacks are that (1) you have to write step definitions in Ruby, unless someone can come up with a clever way to call arbitrary .NET methods directly, (2) it runs Cucumber pretty slowly, at least in my testing, and (3) it doesn’t trivially integrate with existing CI infrastructure like an NUnit-based solution does.
- Use Cuke4Nuke. This is an open-source project that aims to bridge the gap between the original Cucumber tool running on any Ruby interpreter (not necessarily IronRuby) and step definitions written in .NET. It works by hosting your .NET step definitions in a small .NET-based “server” application, which Cucumber communicates with over a TCP/IP connection. I must admit I had a bad experience trying to make this work – it took hours. The latest Ruby interpreter didn’t include all the necessary libraries for Cuke4Nuke, and then when I’d hacked all the dependencies together, it wasn’t clear to me where to put the magic “cucumber.wire” file or what parameters you can use with the .NET server app. And then it was also pretty slow compared to keeping everything in .NET with SpecFlow. And it had a very limited API for running setup/teardown code around scenarios.
If you want to write step definitions in a .NET language, I don’t know why you wouldn’t just use SpecFlow. Since it’s 100% Gherkin-compatible, your feature files could in future be moved to a different implementation if desired. If you’ve tried others, I’d be interested to hear about your experiences. And no, I haven’t tried Spectre yet.
Injecting Mocks into a Running ASP.NET Application
In the next post, I’ll show you one possible way to simplify or speed up UI-level specifications a little. It’s a cross-process code injection library that, among other things, you can use to inject a mock database into a running ASP.NET application without it knowing about it. Or, you can override configuration, or maybe simulate the passing of time.
Sometimes, it isn’t desirable to meddle with your app’s internals, but sometimes it is. Ruby coders can already do it using Webrat or cross-stub, and I’ve found reasons to want that power over .NET apps too.

March 3rd, 2010 at 1:26 pm
I’ve been doing BDD style tests from the controller down for a while now, but I always knew I was missing the part that was important to the end user. I’ve recently started looking at WaTin as a integration test tool but don’t want to go through the hassle of having a “Test” Database.
I’m curious to see how you’ll mock the repository part of the system in a running Asp.Net application.
March 3rd, 2010 at 2:02 pm
This would make an outstanding tekpub video.
March 3rd, 2010 at 2:14 pm
Hi Steve
If you have time, I’d be really interested to know what you think of doing BDD with StoryQ (storyq.codeplex.net). The biggest difference between Specflow and StoryQ is that StoryQ is an internal DSL, so you don’t type code that’s not C# into visual studio. The advantage there is that the steps become more DRY (and refactorable) and that it’s a lot easier for developers to track what’s going on in their unit tests. If installing a VS plugin is an issue then StoryQ is also great.
Sorry that this sounds like an ad for my OSS project, but I’m just trying to get you interested in trying it out! Your feedback would be invaluable.
WRT the rest of your article, you seem to be spot on about what BDD is. Your distinction between C/S and GWT being for unit level / UI level is something I agree with but haven’t seen documented in many places. One thing though: it can be hard to find a link to the nascent Gherkin specification so I’ll post it here: http://wiki.github.com/aslakhellesoy/gherkin/
March 3rd, 2010 at 3:07 pm
Fantastic article, as always Steve. Are you planning on putting BDD concepts / UI testing concepts into your 2.0 version of the MVC book?
March 3rd, 2010 at 3:08 pm
Hi,
Great article and thanks for using WatiN in your example.
When using SpecFlow or Cuke4Nuke, I can recommend installing Cuke4VS (http://github.com/henritersteeg/cuke4vs) and you’ll get story syntax highlighting and a nice integration between your code and the stories/scenarios/steps.
Hth,
Jeroen (lead dev WatiN)
March 3rd, 2010 at 7:34 pm
how about a Tekpub episode on this? I’ll pay for that!
Thanks!
March 3rd, 2010 at 8:46 pm
Hello Steven,
great article. I share many of you experiences and opionions of other frameworks, I mean how on earth can you call = () => readable for example…
I been playing around a bit with SpecFlow and I like it a lot so far. One of the great features for me as being a developer in Sweden, is that it supports Swedish (and several other languages) for writing your .features in.
That makes the whole “communication” bit with your customer much more interesting and real I think.
Very interesting to see your use in conjunction with UI testing.
Thank you
/Marcus
March 3rd, 2010 at 9:34 pm
Steve,
Great article thanks. Can I suggest that you have a look at StoryQ - http://storyq.codeplex.com. It is lightweight running within xUnit test runner of choice. I have combined it even with your IntegrationTest framework to great effect. For teams in dotnet new to BDD has it a low barrier to entry (having gone through the same exercise you document here).
Keep up the great work.
Cheers Todd.
March 4th, 2010 at 5:28 am
Steve, Great post.
March 4th, 2010 at 6:29 am
Hi Steve
Great article, I’m relatively new to TDD and BDD (about a years experience) and have just started a new job where we are looking to improve our unit tests and move to CI with a look to introducing BDD, this article has been a great opener for me and our other devs and it would be interesting to see more.
Rob mentioned the OSS StoryQ which was the tool I had found and was looking to implement seems a great tool. I particularly liked the reporting side of it and integration into Team City. It would be really good to see your thoughts on that compared to SpecFlow??
Keep up the great work. Looking forward to Pro MVC 2 will this have any new approaches to TDD/BDD in it?
March 4th, 2010 at 8:23 am
[…] Behavior Driven Development (BDD) with SpecFlow and ASP.NET MVC - Steve Sanderson talks about the history and background to Behaviour Driven Development, the types of specifications that you can create using these techniques, and looks at using SpecFlow, WatiN, NUnit and ASP.NET MVC to provide a pure .NET BDD solution. […]
March 4th, 2010 at 10:25 am
[comment moved to http://bit.ly/dDsyOb (post about unit testing)]
March 4th, 2010 at 10:55 am
Rob, Toddb, Andrew - Thanks for the pointers towards StoryQ. I had seen that before but didn’t at the time understand why an internal DSL (in C#) would be advantageous over an external one (e.g., Gherkin). Since you’ve all suggested it, I’ll have another look - maybe I missed an important benefit.
Paul - I plan to get a little coverage of UI-level BDD into the MVC 2 book I’m currently working on. However, it’s really a totally separate (and huge) topic from ASP.NET MVC, so I can’t digress into it too deeply.
Jeroen - Thanks very much for the Cuke4VS recommendation. I hadn’t heard of that before, though I was keenly aware of the need for IntelliSense and navigation assistance when you’ve got a lot of Feature files. That tool looks like it could be the missing piece I’ve been hoping to find
Todd - since your comment was about unit testing practices, I hope you don’t mind me moving it to a different post that is about unit testing.
March 4th, 2010 at 12:55 pm
Steve and Andrew - internal DSL versus external DSL is probably a project-specific preference, but to me, the pros and cons as follows:
External DSL:
+++++ Can be written DIRECTLY by non-coders
++ The source is very easy to read
– If the ubiquitous language evolves, it’s very hard to refactor old test suites. This can be partially solved by aliasing step methods (I think NBehave was the first to do this)
- Slightly more ceremony around installing, using, writing and running the tests.
Internal DSL:
– Translating the english to code introduces friction (StoryQ has a converter GUI)
- Source is a little harder to read, especially for non-coders. Workaround is to read the test runner output instead?
+++ Refactorable: Since the code is DRYer (and, well, it’s code), it’s easier to refactor
+ Code completion: Developers can go a little faster with IDE support
+ Simplicity / Portability: You don’t have to install anything on your CI server or development machines, and it’s pretty obvious to new developers where the moving parts are / go.
+ Integration with existing unit test runners. I like the way specflow generates NUnit tests, but when we started StoryQ, NBehave and Cucumber (via ironruby) were the only options. Both of these needed to be run via an external console app, and I couldn’t live without my resharper test runner!
March 4th, 2010 at 2:06 pm
BDD + UI combo works only if application has good enough architecture. Most important thing - proper view model and ability to figure out parts of it from html. Otherwise all these tests are just smoke tests - they are too fragile.
March 4th, 2010 at 2:50 pm
Hi Steve,
Thanks for posting this. Very helpful. I have been wondering about Cucumber for some time, and I was not aware of SpecFlow. Also good summary of TDD vs BDD.
Thanks!
March 4th, 2010 at 11:31 pm
Steve,
The assertion that xSpec frameworks are more appropriate to unit testing and xBehave (or Cucumber) frameworks are more appropriate to functional testing is a perpetuation of cargo cult hysteria. It’s a claim that has been repeated again and again over the past couple of years and has never substantiated. It’s a line that was made up as a way to differentiate rSpec from rBehave back in the day and has never held up to scrutiny. The only thing keeping this meme going is the people new to the tools and practices who are apt to repeat what they are told until they discover otherwise through practice and experience.
I can, and do, as do many others, write functional specs using xSpec frameworks. Not only do I do this, I’ve found that it yields an all-around better result - for test producers as well as for consumers.
Please stop perpetuating this fiction.
March 4th, 2010 at 11:45 pm
Marcus,
Since the assignment of a parameterless lambda can only be done using the ()=> symbols in C#, how do you otherwise get around it when using this language feature in other scenarios?
Since your argument is about readability, can you describe how the use of this text makes specifications less readable in spec frameworks that make use of lambda assignment?
What is your understanding of the cognitive mechanisms that enable readability?
The lambda assignment syntax is a terminator. How does a terminator reduce readability if it appears after the part of the text where readability is the concern? Even if it does have an effect on readability, how does it effect solubility? Are you putting readability before solubility?
Are you thrown off by other terminators in C#? Many VB developers don’t like C# because it uses the ; line terminator universally. How come you can be thrown off by one terminator and not the other? How come VB developers learn to stop paying attention to the ; terminator when they transition to C#? Are you stuck in the same cognitive trap as VB developers who can’t get over C#’s syntax?
March 5th, 2010 at 2:02 pm
You’ve just been Bellwared; stick that on your CV
Ignore him he has his own agenda; context specification rules!
No one would argue that functional testing cant be done using xSpec frameworks; in fact you don’t really need a framework at all. The point is it speeds up the process. Using a tool like specflow allows you to create fixtures in a natural language; these fixtures/conditions of acceptance are mapped directly to test skeletons which specflow generates for you.
Our QA team and product teams are working quite happily with specflow.
Would be interesting to hear how Bellware produces all-around better results using xSpec frameworks/context specification; what are the benefits over specflow/GWT?
Cheers
March 9th, 2010 at 7:43 pm
Scott,
take it easy - it’s just code. Don’t strain yourself…
I was just saying, without know that much about the “cognitive mechanisms that enable readability”, that I think that natural language is more readable than, for example =()=>.
And I have never met an user/product owner/customer that think that code is more readable than a natural language such as Swedish.
Come to think of it, when it come to the parameterless lambda, many programmers I know (myself included) have to think for a while when we see =()=>.
I think =()=> is very expressive and compact - but not very readable.
For the record I hate VB.NET, with a passion (http://www.marcusoft.net/2010/02/vbnet-considered-harmful.html). But I respect the people who want to use it enough to let them use it as they please.
So, I like the SpecFlow (Cucumber-style) way of doing BDD over the MSpec-style. At least for now. I really hope I don’t stay like that forever. Just imagine… to already have decided everything… Brrr…
I also like brass band music over heavy metal, apples over pears and C# over VB.NET.
What about you?
And I will most definitely put that I’ve been Bellwared. It’s an honor.
Take care
/Marcus
March 9th, 2010 at 9:57 pm
[…] would you want this? It’s mainly useful when you’re integration testing. Normally, integration tests can’t directly interact with your application’s code because […]
March 14th, 2010 at 6:06 pm
Steve, I am ashamed to say this is my first time on your blog. You have great content here.
Are you using SpecFlow with your MvcIntegrationTestFramework (good work, btw)? I am going to try it, but it would be nice to have a heads up about any issues.
Thanks.
March 29th, 2010 at 4:16 pm
Bellawarrogant
April 2nd, 2010 at 10:35 am
Steve,
there is a typo in Global.asax (http://github.com/SteveSanderson/GuestbookDemo/blob/master/Guestbook/Global.asax.cs)
The default controller name for the default route is still “Home”. It should be “Guestbook”, I presume? That fails the test if you download the code.
Otherwise I am still happy that you put this out there. I miss some good real-life examples on how to write great scenarios for a real app in all that’s written for BDD. This is a start.
Thank you!
April 14th, 2010 at 2:50 pm
Steve,
The issue that tools like Cucumber resolve by having a text based file to define the tests is allowing seperation of fixture definition from implementation. This becomes important where whoever plays the Customer role wants to define scenarios to use as acceptance criteria prior to development. Typically the goal would be to use these scenarios in planning and as a guide to development from the outside-in.
In this model however you are not running the UI through these tests but the business rules. UI tests have value but can be expensive to maintain, whereas business rule derived tests are cheaper to maintain. It also seperates ‘what’ from ‘how’ clearly. The storytest fixture captures ‘what’ and ‘how’ both code and UI is an implementation detail.
April 14th, 2010 at 4:53 pm
Ian,
Like most methodologies, it depends on the nature of your project. If your product owners want to give specifications in terms of UI interactions (perhaps because your software focuses on complex user interactions - implemented as a mixture of server-side code, JavaScript, CSS, browser behaviours, etc - which is the case for the project I’m mainly thinking of) then naturally you’ll write specifications at that level. For us, the UI wasn’t just an implementation detail! But if your software focuses on complex business rules, then I can see why you’d prefer to write specifications directly about those rules instead.
We found Cucumber’s extra layer of abstraction (natural language on top of code) to be advantageous for talking about UI interactions because it does transcend all those technologies. But we also found the extra abstraction to be positively disadvantageous when specifying lower-level logic, because it’s an extra thing to maintain as compared to plain NUnit/MSpec style specifications about classes and methods, which consumes a lot of extra time in the long run and wasn’t interesting to our product owners anyway.
Thanks for your comment - it’s helped me to clarify some thoughts further.
May 6th, 2010 at 8:29 am
Hi Steve,
Thanks for writing this blog entry. It has helped me in a number of ways - particularly in how to implement the ‘Step’ in a specFlow example.
Thanks
May 7th, 2010 at 9:00 pm
I must say that your current web log is extremely topical. I’ve been investing quite a lot of time for the last last couple months on the lookout at what is on the market influenced by the very fact that I’m arranging to launch a weblog. The information you have put on here is essentially to the point. It just would seem to be so difficult related to all the modern advances that are around, but I just like the way your appears to be. Gotta take pleasure in where technologies has come through the previous 11 years.
May 13th, 2010 at 3:23 am
[…] http://blog.stevensanderson.com/2010/03/03/behavior-driven-development-bdd-with-specflow-and-aspnet-… […]
May 25th, 2010 at 7:17 am
[…] What caused me write this post was one of the recent tweets by the @ScottGu pointing to an article by Rajesh Pillai (BDD using SpecFlow on ASP.NET MVC Application) and also while searching for similar stuff, I found another article with same title but little more theorotical content by Steve Sanderson (Behavior Driven Development (BDD) with SpecFlow and ASP.NET MVC). […]