Windows Support Number

  • Subscribe to our RSS feed.
  • Twitter
  • StumbleUpon
  • Reddit
  • Facebook
  • Digg

Wednesday, 17 October 2012

Tricky continuous testing and self hosting WebAPI issue...

Posted on 09:36 by Unknown
When using WebAPI inside a test fixture make sure you shutdown the HttpSelfHostServer instance correctly or your tests will more than likely fail when run from a continuous testing framework like nCrunch.

See this post for info about using the self hosting version of WebAPI inside a test fixture.

So my tests were running successfully when run inside Visual Studio from either the inbuilt runner or via Reshaper, but were failing when run from nCrunch:
The failing tests weren't consistent either, sometimes none would fail, sometimes a couple, sometimes all...

What the tests had in common was they were using a shared resource setup inside the test fixture setup method - this is like the setup method for a test but scoped at the class (test fixture) level. The setup was failing randomly were it was setting up the WebAPI self host - see highlighted yellow area, you can see the failing icon for nCrunch at the side:
The exception was telling me it was trying to create an instance of the service on a port already assigned:
So my first thought was because the tests for the fixture are being run in parallel then multiple instances of the fixture are trying to be created at the same time and therefore multiple registration attempts for the same port...

But after debugging the code with breakpoints for the SetUp & TearDown it appears this was wrong, these methods were only called once per run. This meant the service wasn't shutting down correctly when test execution had completed.

The TestService class is shown below. I thought I was shutting down the WebAPI host correctly by calling Dispose in the class Dispose method:

   1:  public class TestService : IDisposable
   2:  {
   3:      private readonly string _baseUrl;
   4:   
   5:      private HttpSelfHostServer _server;
   6:   
   7:      public IList<Employee> Employees;
   8:      public IList<Report> Reports;
   9:      public TimeSpan Delay;
  10:   
  11:      public TestService(string baseUrl)
  12:      {
  13:          _baseUrl = baseUrl;
  14:   
  15:          SetUpControllers();
  16:          SetUpHost();
  17:      }
  18:   
  19:      public void Dispose()
  20:      {
  21:          _server.Dispose();
  22:      }
  23:   
  24:      private void SetUpHost()
  25:      {
  26:          var config = new HttpSelfHostConfiguration(_baseUrl);
  27:   
  28:          config.Routes.MapHttpRoute("DefaultAPI", "api/{controller}/{id}", new { id = RouteParameter.Optional });
  29:   
  30:          _server = new HttpSelfHostServer(config);
  31:          _server.OpenAsync().Wait();
  32:      }
  33:   
  34:      private void SetUpControllers()
  35:      {
  36:          Employees = new List<Employee>
  37:          {  
  38:              new Employee { Id = 1, FirstName = "Ollie", LastName = "Riches" },
  39:              new Employee { Id = 2, FirstName = "Steve", LastName = "Austin" },
  40:          };
  41:   
  42:          EmployeesController.Employees = Employees;
  43:   
  44:          Delay = TimeSpan.FromSeconds(3);
  45:          Reports = new List<Report>
  46:          {  
  47:              new Report { Id = 1, Name = "SlowReport" }
  48:          };
  49:   
  50:          ReportsController.Delay = Delay;
  51:          ReportsController.Reports = Reports;
  52:      }
  53:  }

But this wasn't the case, after changing to the following all tests were passing as expected:

   1:  public void Dispose()
   2:  {
   3:      _server.CloseAsync().Wait();
   4:      _server.Dispose();
   5:  }

I had to re-initialising nCrunch to force any remaining service instances to shutdown:
I would have thought calling Dispose on HttpSelfHostServer would have meant it blocked until the server had shutdown but it appears not. Looking into the implementation it appears it doesn't close the server unless a task completion source had already been defined (also shown is the implementation for CloseAsync()):
I hope this helps if you run into this issue :)
Email ThisBlogThis!Share to XShare to FacebookShare to Pinterest
Posted in C#, continuous testing, Development, TDD, unit testing, WebAPI | No comments
Newer Post Older Post Home

0 comments:

Post a Comment

Subscribe to: Post Comments (Atom)

Popular Posts

  • Unit testing Rx methods Timeout & Retry with moq
    Earlier this week I was trying to unit test an asynchronous service (Foo) which used another asynchronous service (Bar) internally and ran i...
  • Understanding RefCount in Reactive Extensions
    A couple of weeks ago  @LordHanson  & I ran into an issue converting a stateless async service exposed as an Rx cold observable to a  co...
  • StructureMap: ILifecycle
    The other day I wanted to control the scope of a service inside a web based app with semantics which didn't fit either 'HttpContextS...
  • MVVM anti-pattern: Injecting the IoC container into a View Model
    This is another anti-pattern I've seen a lot recently, the dynamic use of the IoC container inside a view model to resolve child view mo...
  • How many pins can Bing Maps handle in a WP7 app - part 1
    part2 -  http://awkwardcoder.blogspot.com/2011/10/how-many-pins-can-bing-maps-handle-in.html part3 -  http://awkwardcoder.blogspot.com/2011/...
  • Bad developers love 'The Daily WTF'
    When 'The Daily WTF' started up back in 2003/2004 it was a great laugh looking at shocking code other developers wrote, but after a ...
  • Using CompositeDisposable in base classes
    To help make an object eligible for collection by the GC (garbage collector) one would implement the IDisposable interface. Executing the di...
  • Implementing a busy indicator using a visual overlay in MVVM
    This is a technique we use at work to lock the UI whilst some long running process is happening - preventing the user clicking on stuff whil...
  • Daily Dilbert Service - the most important service I've ever written...
    NuGet package available here ... First off a big shout to  @hamish  &  @leeoades  on this one - I'm just blogging about it. At work ...
  • Comparing performance of .Net 4.5 to .Net 4.0 for WPF
    Currently I'm working on a .Net 4.0 WPF app and we've had some discussion about moving to .Net 4.5, we don't get to make the dec...

Categories

  • .Net
  • .Net 4.5
  • Abstractions
  • Advertising
  • Agile
  • Agile Courage
  • AOP
  • Async
  • automated testing
  • Azure
  • Azure IIS RESTful development
  • BDD
  • Bing Maps
  • Bounded Context
  • C#
  • C# 5.0
  • Caching
  • Chocolatey
  • CLoud
  • CodePlex
  • Coding
  • Coding Building CI Testing
  • Coding C#
  • coding C# IoC StructureMap
  • Coding Functional-Programming
  • Coding REST Knowledge
  • Coding Services
  • Coding TDD Refactoring Agile
  • Command
  • continuous testing
  • coupling
  • CultureInfo
  • DAL
  • databases
  • DDD
  • DDD Coaching
  • DDD Domain Events Auditing nHibernate
  • DDD Entities Value Objects
  • Debugging
  • Design Patterns
  • Design Patterns Databases Auditing
  • Developement
  • Development
  • Development Coding
  • Development Process
  • Development unit testing
  • Development VS 2011
  • Diagnostics
  • Disposable
  • Exceptions
  • FINDaPAD
  • FindaPad Property Rental Windows Phone 7 Mobile Devices
  • Fun Coding Duct-Tape
  • Hotfixes
  • integration testing
  • IoC
  • jasmine
  • javascript
  • Jobs Development
  • LINQ
  • marketplace
  • Mobile Devices
  • Mocking
  • MSDN Coding
  • MSpec
  • Multilingual
  • MVC
  • MVVM
  • nCrunch
  • nHbiernate Repository Pattern Criteria
  • nHibernate Auditing Design Fluent
  • nHibnerate Entities Events Listeners
  • node.js
  • nodes.js
  • Nokia
  • NoSQL RavenDB Azure Development
  • Observations
  • OO
  • ORM
  • Performance
  • Portable Class Library
  • Portable Library
  • PostSharp
  • Process
  • Rants
  • RavenDB IIS 7.5 Development
  • Reactive
  • Reactive Extension
  • Reactive Extensions
  • ReadOnlyCollections
  • Resharper
  • REST Distributed-Systems
  • REST HTTP
  • rest web
  • RESTful
  • Rx
  • Serialization
  • Silverlight
  • Silverlight Installation
  • Task
  • TDD
  • TDD IoC DI
  • TDD Mocking
  • TDD Team Observation
  • Telerik
  • testing
  • threading
  • TPL
  • UI
  • Undo-Redo
  • unit testing
  • ViewModels
  • VS 2012
  • wcf
  • web api
  • Web Services
  • web services mobile devices data
  • WebAPI
  • Windows
  • Windows 8
  • windows phone
  • Windows Phone 7
  • WP7
  • WP7 Bing Maps Development Network HTTP
  • WP7 Bing Maps Development UK Crime
  • WP7 Bing Maps Development UK Crime Clustering
  • WP7 Bing Maps Development UK Polygons Clustering Performance
  • WP7 cryptography bouncy castle
  • WP7 Cultures C#
  • WP7 feedback development app store
  • WP7 Javascript web browser
  • WP7 MSBuild
  • WP7 ORM Databases performance
  • WP7 Serialisation
  • WP7 SilverlightSerializer C#
  • WP7 sqlite performance development
  • WP7 WP7Contrib Bing Maps Development
  • WP7 WP7Contrib Bing Maps Polygon Development
  • WP7 WP7Contrib CodePlex
  • WP7 WP7Contrib CodePlex Bing Maps Development
  • WP7 WP7Contrib CodePlex ObservableCollection
  • WP7 WP7Contrib ILMerge .Net
  • WP7 WP7Contrib Phone Maps
  • WP7 WP7Contrib SilverlightSerializer C#
  • WP7Contrib
  • WP7Contrib Bing Maps WP7
  • WP7Contrib WP7 Geo-Location development C#
  • WP7Contrib WP7 HTTP Compression
  • WP7Contrib WP7 Url Development Rx
  • WP7Dev
  • WPF
  • WPF Cultures
  • WuApi
  • XAML

Blog Archive

  • ►  2013 (16)
    • ►  November (5)
    • ►  September (3)
    • ►  August (1)
    • ►  July (1)
    • ►  June (3)
    • ►  May (2)
    • ►  January (1)
  • ▼  2012 (44)
    • ►  November (2)
    • ▼  October (8)
      • Trying to be more functional with Rx
      • Building a simple Portable Class Library - Simple....
      • Tricky continuous testing and self hosting WebAPI ...
      • Exception handling for an async method
      • Self hosting a web service inside a test fixture u...
      • Using GetRequestStreamAsync and GetResponseAsync i...
      • Testing time based observable in Rx is so easy...
      • Using CompositeDisposable in base classes
    • ►  September (5)
    • ►  August (2)
    • ►  July (4)
    • ►  June (3)
    • ►  May (1)
    • ►  April (2)
    • ►  March (13)
    • ►  February (4)
  • ►  2011 (52)
    • ►  December (3)
    • ►  November (5)
    • ►  October (7)
    • ►  September (7)
    • ►  August (11)
    • ►  July (4)
    • ►  May (2)
    • ►  April (1)
    • ►  March (5)
    • ►  February (3)
    • ►  January (4)
  • ►  2010 (1)
    • ►  August (1)
  • ►  2009 (32)
    • ►  December (3)
    • ►  November (7)
    • ►  October (6)
    • ►  September (11)
    • ►  April (1)
    • ►  March (4)
Powered by Blogger.

About Me

Unknown
View my complete profile