4. August 2013

Mocking Controller Context with HTTP Request for Unit Testing ApiController of ASP.NET WebApi

For a new project I am using ASP.NET Web API. Web API is a great way to implement REST services.

Web API makes many things easier, but there is one thing missing: simple unit testing of controllers. You can definitely call controller methods like Get() and Get(id). But it is not easy to prepare the controller's server context so, that Request.CreateResponse() works correctly. Also, if you want to return the URI of a newly created (Post-ed) item, then a lot of wiring has to be done around ApiController's properties Request and ControllerContext,

Here is my solution: I am extending ApiController with a MockRequest function, which sets up the routing stuff like routes, route data, request URI. The goal is, that the controller method can:
- check the request URI including the query,
- create URLs using the route template,
- create a HttpResponseMessage as result.

The MockRequest method is called like:
var controller = new ProductsController(productRepository);
controller.MockRequest(HttpMethod.Get, new { controller = "products", id = 1 });
Product result = controller.Get(1);
Assert.Equal(result.Name, "Tomato Soup");
Implementation:
public static class ApiControllerExtensions
{
  public static void MockRequest(this ApiController self, HttpMethod httpMethod, object routeValues)
  {
    var routeValueDict = new HttpRouteValueDictionary();
    foreach (var prop in routeValues.GetType().GetProperties()) {
      routeValueDict.Add(prop.Name, prop.GetValue(routeValues, null));
    }
    var config = new HttpConfiguration();
    var request = new HttpRequestMessage { Method = httpMethod, RequestUri = new Uri("http://localhost/") };
    var route = config.Routes.MapHttpRoute("DefaultApi", "api/{controller}/{id}", defaults: new { id = RouteParameter.Optional });
    var routeData = new HttpRouteData(route, routeValueDict);
    self.ControllerContext = new HttpControllerContext(config, routeData, request);
    self.Request = request;
    self.Request.Properties.Add(HttpPropertyKeys.HttpRouteDataKey, routeData);
    self.Request.Properties[HttpPropertyKeys.HttpConfigurationKey] = config;
    self.Request.RequestUri = new Uri(self.Url.Link("DefaultApi", routeValues));
  }
}

Note: the argument routeValues also takes additional properties, which are automatically converted to query parameters, because they do not fit the route template. Just as it should be.

Note: the route template is fixed to "api/{controller}/{id}". If you have a different template, change it or make it a parameter of MockRequest. I did not want too many variables, because my project only has /api/controller[/id] URIs.

Note: don't ask me why the request is set up with a default URI "http://localhost/", then later the RequestURI property is set explicitly. Without the prior "http://localhost/", self.Url.Link() always returns null.

Note: there is more to do if you want to unit test model validation as well. See Unit test WebAPI Controllers with Model Validation. Looks good, but does not compile with my NET 4.0. If you also want to check the formatting, then you might need to talk to an in memory HTTP server (which will also include the model validation).

_happy_routing()

6. Juni 2013

Immediate Disconnect for strophe.js

Updated A Website Chat made easy with XMPP and BOSH with my findings on immediate disconnect with strophe.js on page unload.

Problem:
The connection should be closed when the page unloads. Unfortunately strophe.js (at least up to version 1.0.2) disconnects asynchronously, which does not work when the page is destroyed. After some time the XMPP server will notice, that the page disappeared and will close the connection. But if you do not want to wait, then we have to force strophe to close immediately.

Solution:
There is a strophe patch, which allows for synchronous connection closing. The patch must be applied to the strophe.js file. Just 2 lines of code in strophe,js and one line before calling disconnect().

See A Website Chat made easy with XMPP and BOSH.

_happy_closing()

3. Juni 2013

Erster Weblin mit schwarzer Krone

Es passiert ja nicht wirklich viel im Weblin-Land, aber manchmal gibt es doch einen Grund zu feiern. Wir haben den ersten Weblin mit mehr als 2^16 Punkten (=65536) und deshalb mit schwarzer Krone am Avatar.

Hier ein Screenshot von http://www.weblin.com/toplins.php:


Macr@Soft ist ewiger Ruhm sicher.



_happy_pointscollecting()

http://de.blog.weblin.com/2013/06/erster-weblin-mit-schwarzer-krone.html
http://blog.weblin.com/2013/06/first-weblin-with-black-crown.html

15. Mai 2013

2 1/2 Zi. Wohnung in Freiburg zu vermieten ab 1.7.2013

Ist vermietet:


2 1/2 Zimmer 41 qm ab 1.7.
1. OG, 2 1/2 Zi, EBK, Bad, Flur, Wohnzimmer, Schlafzimmer, Keller, Aufzug, Bauj. 1995, super Zuschnitt, Tennenbacherstr. 50, 79106 Freiburg, Nähe Institutsviertel, Straßenbahn Haltestelle vor dem Haus, 480,- € KM, 160,- € NK, Kaution 3 x KM, keine Provision, wolf.heiner@gmail.com, Tel. 0171 / 2848461

Besichtigungstermin: Sa. 25. Mai 13 - 16 h


7. März 2013

Galactic Developments Interview

Mein Interview zum Galactic Developments Open Source Science Fiction Projekt ist online auf dem Flyficfiction Fantasy Blog.

_happy_reading()

6. Januar 2013

Wolfspelz für alle

Diese informative Grafik soll zeigen, wie man
aus einer schönen Umsatzentwicklung durch
zusätzliche Pfeile eine bedenkliche
Marktsättigung herbeiargumentieren kann.
(Quelle: FAZ.net)
Das amerikanische Schwesterunternehmen von Wolfspelz legt mächtig zu. Auch in Deutschland will Wolfspelz jetzt groß rauskommen, hat es aber nicht leicht.

Wie im Artikel zu lesen, gibt es auf dem deutschen Markt besondere Herausforderungen. Händler klagen: "Vor allem Jacken hat inzwischen so ziemlich jeder".

Das erklärt endlich, warum Wolfspelz in Deutschland noch nicht ganz dominiert und auch warum dieser Blog nicht jeden Tag die magische Grenze von 20 Visits übertreffen kann, mit denen er in die illustre Riege der C-Blogger aufsteigen würde.

_happy_skinjacking()

4. November 2012

Die besten Science Fiction

...die ich gelesen habe:
Ich habe eine Schwäche für Imperien und die Föderation, Historie und Archäologie, Hard Science, große Zahlen, Ausserirdische ohne spitze Ohren oder Noppen auf der Nase, Agenten und Verschwörungstheorien, Zeitreisen ohne Paradoxe, Cyberpunk, Laser Cluster, Nano, KI und manchmal Monarchie, Ehre, Pflicht, Helden. Ich bin immer für den Jungen (die junge Frau) vom Lande, der (die) mit Hilfe von Outlaws die Prinzessin (den Prinzen) befreit und das Empire rettet.

Die Liste der 13 "Besten" bildet genau das ab.
(o. B. d. R. - ohne Beachtung der Reihenfolge)

Die Legende von Christopher Sim / A Talent For War (Jack McDevitt)
Ich mag die Kombination von Archäologie und Zukunft. Rätsel und überraschende Wendungen. Nichts ist so wie die offizielle Geschichtsschreibung (der Zukunft) behauptet. Die anderen Romane über Alex Benedict, Antiquitätenhändler im 12. Jahrtausend, sind genauso gut. Trotz ferner Zukunft nicht techniklastig. "Epilogue: He read the inscription. Jerome Courtney died 40 years _after_ the war. Tears filled his eyes, and he went down on one knee". Sehr ergreifend (wenn man es gelesen hat). Emotion in Slow Motion nach 300 kurzweiligen Seiten. 

Die Stimme des Wirbelwinds / Voice of the Whirlwind (Walter Jon Williams)
Megacorps, Aliens, KI, Kloning, orbitale Mächte. Ein Ex-Agent wacht ohne Erinnerung auf und rettet am Ende, nach viel hin und her, die Menschheit vor einer Verschwörung. Klingt platt, ist aber eine gute Story im klassischen Cyberpunk Szenario, komplett mit Daumennagel-Displays und Video T-Shirts. Walter Jon Williams versteht was von Technik, im Gegensatz zu William Gibson, der tolle visionäre Stories schreibt, aber die IT, naja.

Der verschollene Computer / The Cosmic Computer (H. Beam Piper)
Aufstieg und Fall von Zivilisationen bewegen mich immer. Auf einem Randplaneten der Föderation: Jahrzehnte nach dem Sezessionskrieg entdecken Schatzsucher ein Geheimnis, das die Föderation zu Fall bringen kann.
 
Die Ehre der Königin / The Honor of the Queen (David Weber)
Harte Military SF: Nicht wirklich pazifistisch korrekt, aber so ist die "Realität" eben manchmal. Politische Intrigen, High-Tech Marines und religiöse Fanatiker. Ein friedliches Königreich sucht Verbündete gegen einen übermächtigen Gegner und die lokalen Einsatzkräfte müssen den höchsten Einsatz bringen, um einen ganzen Planeten zu retten. Action pur. Point Defense Laser Cluster, Missile Launcher und Gamma Ray Laser garantiert.

Die Sphären / Matter (Iain M. Banks)
Hier aufgeführt als Vertreter der Kultur-Romane. Das hätte auch "Bedenke Phlebas" oder "Excession" sein können. Eines der am weitesten gespannten großartigsten Zukunftsszenarien. Mit allem was in der Science Fiction gut und teuer ist: Nano, Effektoren, hyperintelligente KI mit komischen Namen ("Not Invented Here"), uralte Zivilisationen, gigantische Raumschiffe, Formenergie, Displacement, Antimaterie, Trillionen Individuen menschlicher und anderer Bevölkerung auf gewaltigen Orbitalen, Androiden, Schiffsavatare, Mind-State-Backups. Mit High-Tech neben primitiven Planeten, wo man sich eigentlich nicht einmischen darf. Manche machen es aber doch, wie z.B. der euphemistisch bezeichnete Dienst für "Besondere Umstände" der "Kontakt" Sektion der "Kultur". Die Prinzessin eines primitiven Planeten, die in der Kultur als Kontakt-Agentin ausgebildet wurde, versucht die Milliarden Bewohner ihrer (künstlichen) Heimatwelt vor einer uralten Gefahr zu retten. Vorher muss ihr Bruder sie aber erst finden. Dafür reist er weit über seine eigenen Welt hinaus durch die "Kultur". Hat Längen, aber dafür ein dramatisches Ende. Eine Pflichtlektüre, wegen des phantastischen Szenarios. Da sehen andere Far-Future Settings echt alt aus.

Transhuman Space (David Pulver et al.)
Near Future Hard Science: Die Welt am Beginn des 22. Jahrhunderts. Kein Roman, sondern ein Rollenspiel-Setting mit dichten Fakten und kurzen Story-Fragmenten. Sehr realistisch extrapolierte Geopolitik mit 8 Großmächten, Gengineering, Memetik, Rogue AI, Mars Triaden, Fusion-Drives, High-Frontier und Broken Dreams. Wenn man David Pulver etwas vorwerfen will, dann, dass er ein Jahr vor 9/11 geschrieben hat, denn sonst hätten die Negative Growth Terrorristen den Mars Elevator wohl mit einer Nuklearwaffe doch zerstört.

Das Erdenbuch von Sturmtor / The Earth Book of Stormgate (Poul Anderson)
Kurze und längere Geschichten der Polesotechnischen Liga. Die Abenteuer unabhängiger Sternenhändler wie Nicholas van Rijn. Rätsel, Abenteuer und oft überraschende Lösungen. Erzählt aus der Sicht von Hloch vom Sturmtor Clan des fliegenden Volkes der Ythri. Im "Erdenbuch" findet man auch die Vorgeschichte der Agentenromane mit Dominic Flandry, die einige hundert Jahre später zur Zeit des Imperiums spielen.

Schismatrix / Schismatrix (Bruce Sterling)
Ein paar Jahrhunderte durch die fragmentierte Zukunft der Menschheit im Sonnensystem. Unterhaltsame Story. Der interplanetare Teil der Menschheit entwickelt sich in verschiedene Richtungen, trägt Konflikte offen und verdeckt aus während die Erde eine öko(nom|log)ische Katastrophe erfährt, was den raumfahrenden Teil nicht wirklich interessiert. Ein krazzes Zukunftsbild. Sehr bunt. Alternativ: Diamond Age, weil Neal Stephenson auf jeden Fall hier erwähnt werden muss.

Der Splitter im Auge Gottes / The Mote in God's Eye (Larry Niven und Jerry Pournelle)
Ausserirdische können auch mal ganz anders. Andere Intelligenz, andere Motive, andere Zivilisation. Ein fremdartiges Sonnensystem mit dem Bruttosozialprodukt des gesamten Empires der Menschen, das selbst gerade geschwächt aus einem Bürgerkrieg kommt. Die Expeditionsflotte muss herausfinden ob sie einer Chance oder einer Bedrohung gegenübersteht. Fast trifft man die falsche Entscheidung. Wer Larry Niven sagt, muss auch Ringwelt sagen. Ringwelt selbst ist ok, aber die unzähligen Geschichten aus dem Ringwelt-Universum Franchise sind unvergleichlich. Viele sind sehr sehr gut, aber die meisten eher Kurzgeschichten, deshalb hier nicht vertreten. Wenn mal Zeit ist für 20 k Seiten, dann Ringwelt-Universum. 

Himmelssturz / Pushing Ice (Alastair Reynolds)
Ein kommerzieller Eis-Miner entdeckt ein riesiges Artefakt und jagt hinterher. Es wird eine ungewollte Reise in die ferne Zukunft, Politik und Intrigen an Bord, realistische Technik, sehr andersartige Aliens und in größer Not kommt überraschend Hilfe aus der Vergangenheit. Ich hatte mich schon gewundert, was das erste Kapitel eigentlich sollte. Weiterlesen! klärt sich alles auf. 

Eine Tiefe am Himmel / A Deepness in the Sky (Vernor Vinge)
Ein Stern der regelmäßig ausgeht. Zwei Fraktionen von Menschen wollen den Stern erforschen und treffen dort auf eine Alien-Zivilisation die regelmäßig in Winterschlaf geht. Oft aus Sicht der Aliens erzählt, die so gesehen ganz normale Wesen sind, mit Hoffnungen, Politik und Ambitionen. Während sich diese Aliens entwickeln, bleiben Konflikte zwischen den Menschen nicht aus. Realistische High-Tech. Zwei parallele Stränge: die aktuelle Geschichte und der Hintergrund. Die beiden Erzählfäden laufen natürlich im Finale dramatisch zusammen. Vernor Vinge's Zones of Though Universum umspannt die Galaxie und Jahrtausende. Hier ist nur ein kleiner Ausschnitt. Mehr Context gibt es in "A Fire Upon the Deep" auch wieder mit (anderen) ganz besonderen Aliens. Gleich danach lesen! 

Gottes Maschinen / The Engines of God (Jack McDevitt)
Wieder Archäologie und Geheimnisse. Aber es gibt leider nicht so viele Romane ohne Gewalt und Krieg. Deshalb darf Jack McDevitt hier zweimal. Atlantis untergegangen, Sodom und Gomorra durch "Gottes Zorn" ausgelöscht. Das war vor langer Zeit. Interstellare Forschungen zeigen, dass auch auf anderen Planeten die Zivilisation regelmäßig untergegangen wird. "Irgendetwas im Zentrum der Galaxie mag anscheinend keine Mauern".

Sternenkrieger / Starship Troopers (Robert A Heinlein)
Durch den Kinofilm komplett verzerrt. (Bitte den Film jetzt mal ignorieren). Eigentlich eine klassische Hero's Journey: Johnnie geht aus Liebe und Dummheit zum Militärdienst. Nach der "härtesten Ausbildung" unter dem "besten Platoon Sergeant" stolpert er durch die Einsätze, unsicher, aber doch irgendwie gut und auf jeden Fall kurzweilig. Inzwischen ist nun doch offiziell Krieg gegen die Bugs und man kommt nicht mehr aus dem Militärdienst raus, ups. Also weiterstolpern, verlieben, dann Offiziersanwärter und schließlich eine Schlüsselrolle bei einer entscheidenden Kommandoaktion. "Jedes Jahr gewinnen wir ein bisschen mehr". Heinlein hat die Powered Battle Armor erfunden (siehe Avatar und Matrix), genial für die damalige Zeit und in der technischen Beschreibung immer noch aktuell. Vielleicht ist er auch der Erfinder des Boot-Camp Tropes (das einzige Trope nicht auf tvtropes).
_happy_reading()