Following on from a previous post, here’s an updated set of StructureMap assertions:
public static class StructureMapAssert
{
public static void AssertSingleton<T>(this IContainer container)
{
var instance1 = AssertResolvable<T>(container);
var instance2 = AssertResolvable<T>(container);
Assert.That(instance1, Is.SameAs(instance2));
}
public static void AssertTransient<T>(this IContainer container)
{
var instance1 = AssertResolvable<T>(container);
var instance2 = AssertResolvable<T>(container);
Assert.That(instance1, Is.Not.SameAs(instance2));
}
public static void AssertHttpRequestScoped<T>(this IContainer container)
{
T instance2;
using (new MockHttpContext())
{
var instance1 = AssertResolvable<T>(container);
instance2 = AssertResolvable<T>(container);
Assert.That(instance1, Is.SameAs(instance2));
}
var instance3 = AssertResolvable<T>(container);
Assert.That(instance3, Is.Not.SameAs(instance2));
}
private static T AssertResolvable<T>(this IContainer container)
{
try
{
return container.GetInstance<T>();
}
catch (Exception)
{
Console.WriteLine(container.WhatDoIHave());
throw;
}
}
private class MockHttpContext : IDisposable
{
private readonly StringWriter _stringWriter;
private readonly HttpContext _httpContext;
public MockHttpContext()
{
_httpContext = HttpContext.Current;
var httpRequest = new HttpRequest("test.aspx", "http://localhost", "?a=1&b=2");
_stringWriter = new StringWriter();
var httpResponse = new HttpResponse(_stringWriter);
HttpContext.Current = new HttpContext(httpRequest, httpResponse);
}
public void Dispose()
{
_stringWriter.Dispose();
HttpContext.Current = _httpContext;
}
}
}
public class RegistryTests
{
private IContainer container;
[TestFixtureSetUp]
public void FixtureSetUp()
{
container = BootstrapContainer();
}
[Test]
public void SessionFactory()
{
container.AssertSingleton<ISessionFactory>();
}
[Test]
public void Session()
{
container.AssertHttpRequestScoped<ISession>();
}
[Test]
public void ThingyRepository()
{
container.AssertTransient<IThingyRepository>();
}
}