Skip to content

Commit

Permalink
fix for #431
Browse files Browse the repository at this point in the history
  • Loading branch information
adamralph committed Nov 9, 2013
1 parent fe78c8a commit 86c0c5f
Show file tree
Hide file tree
Showing 2 changed files with 56 additions and 19 deletions.
21 changes: 17 additions & 4 deletions Extras/Source/Autofac.Extras.FakeItEasy/AutoFake.cs
Expand Up @@ -54,17 +54,24 @@ public class AutoFake : IDisposable
/// <param name="callsDoNothing"> /// <param name="callsDoNothing">
/// <see langword="true" /> to configure fake calls to do nothing when called. /// <see langword="true" /> to configure fake calls to do nothing when called.
/// </param> /// </param>
/// <param name="builder">The container builder to use to build the container.</param>
/// <param name="onFakeCreated">Specifies an action that should be run over a fake object once it's created.</param> /// <param name="onFakeCreated">Specifies an action that should be run over a fake object once it's created.</param>
public AutoFake( public AutoFake(
bool strict = false, bool strict = false,
bool callsBaseMethods = false, bool callsBaseMethods = false,
bool callsDoNothing = false, bool callsDoNothing = false,
Action<object> onFakeCreated = null) Action<object> onFakeCreated = null,
ContainerBuilder builder = null)
{ {
var builder = new ContainerBuilder(); if (builder == null)
builder.RegisterSource(new AnyConcreteTypeNotAlreadyRegisteredSource()); {
builder = new ContainerBuilder();
}

builder.RegisterSource(new AnyConcreteTypeNotAlreadyRegisteredSource().WithRegistrationsAs(b => b.InstancePerLifetimeScope()));
builder.RegisterSource(new FakeRegistrationHandler(strict, callsBaseMethods, callsDoNothing, onFakeCreated)); builder.RegisterSource(new FakeRegistrationHandler(strict, callsBaseMethods, callsDoNothing, onFakeCreated));
this._container = builder.Build(); this._container = builder.Build();
this._container.BeginLifetimeScope();
} }


/// <summary> /// <summary>
Expand Down Expand Up @@ -100,11 +107,17 @@ public void Dispose()
/// <typeparam name="T">The type of the service.</typeparam> /// <typeparam name="T">The type of the service.</typeparam>
/// <param name="parameters">Optional parameters</param> /// <param name="parameters">Optional parameters</param>
/// <returns>The service.</returns> /// <returns>The service.</returns>
public T Create<T>(params Parameter[] parameters) public T Resolve<T>(params Parameter[] parameters)
{ {
return this.Container.Resolve<T>(parameters); return this.Container.Resolve<T>(parameters);
} }


[Obsolete("Use Resolve<T>() instead")]
public T Create<T>(params Parameter[] parameters)
{
return this.Resolve<T>(parameters);
}

/// <summary> /// <summary>
/// Resolve the specified type in the container (register it if needed) /// Resolve the specified type in the container (register it if needed)
/// </summary> /// </summary>
Expand Down
54 changes: 39 additions & 15 deletions Extras/Tests/Autofac.Extras.Tests.FakeItEasy/AutoFakeFixture.cs
Expand Up @@ -14,17 +14,17 @@ public void ByDefaultFakesAreNotStrict()
{ {
using (var fake = new AutoFake()) using (var fake = new AutoFake())
{ {
var foo = fake.Create<Foo>(); var foo = fake.Resolve<Foo>();
Assert.DoesNotThrow(() => foo.Go()); Assert.DoesNotThrow(() => foo.Go());
} }
} }


[Test] [Test]
public void CanCreateStrictFakes() public void CanResolveStrictFakes()
{ {
using (var fake = new AutoFake(strict: true)) using (var fake = new AutoFake(strict: true))
{ {
var foo = fake.Create<Foo>(); var foo = fake.Resolve<Foo>();
Assert.Throws<ExpectationException>(() => foo.Go()); Assert.Throws<ExpectationException>(() => foo.Go());
} }
} }
Expand All @@ -34,18 +34,18 @@ public void ByDefaultFakesDoNotCallBaseMethods()
{ {
using (var fake = new AutoFake()) using (var fake = new AutoFake())
{ {
var bar = fake.Create<Bar>(); var bar = fake.Resolve<Bar>();
bar.Go(); bar.Go();
Assert.False(bar.Gone); Assert.False(bar.Gone);
} }
} }


[Test] [Test]
public void CanCreateFakesWhichCallsBaseMethods() public void CanResolveFakesWhichCallsBaseMethods()
{ {
using (var fake = new AutoFake(callsBaseMethods: true)) using (var fake = new AutoFake(callsBaseMethods: true))
{ {
var bar = fake.Create<Bar>(); var bar = fake.Resolve<Bar>();
bar.Go(); bar.Go();
Assert.True(bar.Gone); Assert.True(bar.Gone);
} }
Expand All @@ -56,31 +56,31 @@ public void ByDefaultFakesRespondToCalls()
{ {
using (var fake = new AutoFake()) using (var fake = new AutoFake())
{ {
var bar = fake.Create<IBar>(); var bar = fake.Resolve<IBar>();
var result = bar.Spawn(); var result = bar.Spawn();
Assert.NotNull(result); Assert.NotNull(result);
} }
} }


[Test] [Test]
public void CanCreateFakesWhichDoNotRespondToCalls() public void CanResolveFakesWhichDoNotRespondToCalls()
{ {
using (var fake = new AutoFake(callsDoNothing: true)) using (var fake = new AutoFake(callsDoNothing: true))
{ {
var bar = fake.Create<IBar>(); var bar = fake.Resolve<IBar>();
var result = bar.Spawn(); var result = bar.Spawn();
Assert.Null(result); Assert.Null(result);
} }
} }


[Test] [Test]
public void CanCreateFakesWhichInvokeActionsWhenCreated() public void CanResolveFakesWhichInvokeActionsWhenResolved()
{ {
object createdFake = null; object resolvedFake = null;
using (var fake = new AutoFake(onFakeCreated: obj => createdFake = obj)) using (var fake = new AutoFake(onFakeCreated: obj => resolvedFake = obj))
{ {
var bar = fake.Create<IBar>(); var bar = fake.Resolve<IBar>();
Assert.AreSame(bar, createdFake); Assert.AreSame(bar, resolvedFake);
} }
} }


Expand All @@ -92,7 +92,7 @@ public void ProvidesInstances()
var bar = A.Fake<IBar>(); var bar = A.Fake<IBar>();
fake.Provide(bar); fake.Provide(bar);


var foo = fake.Create<Foo>(); var foo = fake.Resolve<Foo>();
foo.Go(); foo.Go();


A.CallTo(() => bar.Go()).MustHaveHappened(); A.CallTo(() => bar.Go()).MustHaveHappened();
Expand All @@ -111,6 +111,30 @@ public void ProvidesImplementations()
} }
} }


[Test]
public void ByDefaultAbstractTypesAreResolvedToTheSameSharedInstance()
{
using (var fake = new AutoFake())
{
var bar1 = fake.Resolve<IBar>();
var bar2 = fake.Resolve<IBar>();

Assert.AreSame(bar1, bar2);
}
}

[Test]
public void ByDefaultConcreteTypesAreResolvedToTheSameSharedInstance()
{
using (var fake = new AutoFake())
{
var baz1 = fake.Resolve<Baz>();
var baz2 = fake.Resolve<Baz>();

Assert.AreSame(baz1, baz2);
}
}

public interface IBar public interface IBar
{ {
bool Gone { get; } bool Gone { get; }
Expand Down

0 comments on commit 86c0c5f

Please sign in to comment.