Skip to content

Commit 8f92ac2

Browse files
committed
Additional unit tests related to #965 to make sure decorators can be applied more than once if intentional.
1 parent 7aa556a commit 8f92ac2

File tree

2 files changed

+73
-0
lines changed

2 files changed

+73
-0
lines changed

test/Autofac.Specification.Test/Features/DecoratorTests.cs

+37
Original file line numberDiff line numberDiff line change
@@ -276,10 +276,47 @@ public void DecoratorAppliedOnlyOnceToComponentWithExternalRegistrySource()
276276

277277
var scope = container.BeginLifetimeScope(b => { });
278278
var service = scope.Resolve<IDecoratedService>();
279+
279280
Assert.IsType<DecoratorA>(service);
280281
Assert.IsType<ImplementorA>(service.Decorated);
281282
}
282283

284+
[Fact]
285+
public void DecoratorCanBeAppliedTwice()
286+
{
287+
var builder = new ContainerBuilder();
288+
builder.RegisterType<ImplementorA>().As<IDecoratedService>();
289+
builder.RegisterDecorator<DecoratorA, IDecoratedService>();
290+
builder.RegisterDecorator<DecoratorA, IDecoratedService>();
291+
var container = builder.Build();
292+
293+
var service = container.Resolve<IDecoratedService>();
294+
295+
Assert.IsType<DecoratorA>(service);
296+
Assert.IsType<DecoratorA>(service.Decorated);
297+
Assert.IsType<ImplementorA>(service.Decorated.Decorated);
298+
}
299+
300+
[Fact]
301+
public void DecoratorCanBeAppliedTwiceInChildLifetimeScope()
302+
{
303+
var builder = new ContainerBuilder();
304+
builder.RegisterType<ImplementorA>().As<IDecoratedService>();
305+
builder.RegisterDecorator<DecoratorA, IDecoratedService>();
306+
var container = builder.Build();
307+
308+
var scope = container.BeginLifetimeScope(b => b.RegisterDecorator<DecoratorA, IDecoratedService>());
309+
var scopeInstance = scope.Resolve<IDecoratedService>();
310+
311+
Assert.IsType<DecoratorA>(scopeInstance);
312+
Assert.IsType<DecoratorA>(scopeInstance.Decorated);
313+
Assert.IsType<ImplementorA>(scopeInstance.Decorated.Decorated);
314+
315+
var rootInstance = container.Resolve<IDecoratedService>();
316+
Assert.IsType<DecoratorA>(rootInstance);
317+
Assert.IsType<ImplementorA>(rootInstance.Decorated);
318+
}
319+
283320
[Fact]
284321
public void DecoratorCanBeAppliedToServiceRegisteredInChildLifetimeScope()
285322
{

test/Autofac.Test/Features/Decorators/OpenGenericDecoratorTests.cs

+36
Original file line numberDiff line numberDiff line change
@@ -550,6 +550,42 @@ public void DecoratorAppliedOnlyOnceToComponentWithExternalRegistrySource()
550550
Assert.IsType<ImplementorA<int>>(service.Decorated);
551551
}
552552

553+
[Fact]
554+
public void DecoratorCanBeAppliedTwice()
555+
{
556+
var builder = new ContainerBuilder();
557+
builder.RegisterGeneric(typeof(ImplementorA<>)).As(typeof(IDecoratedService<>));
558+
builder.RegisterGenericDecorator(typeof(DecoratorA<>), typeof(IDecoratedService<>));
559+
builder.RegisterGenericDecorator(typeof(DecoratorA<>), typeof(IDecoratedService<>));
560+
var container = builder.Build();
561+
562+
var service = container.Resolve<IDecoratedService<int>>();
563+
564+
Assert.IsType<DecoratorA<int>>(service);
565+
Assert.IsType<DecoratorA<int>>(service.Decorated);
566+
Assert.IsType<ImplementorA<int>>(service.Decorated.Decorated);
567+
}
568+
569+
[Fact]
570+
public void DecoratorCanBeAppliedTwiceInChildLifetimeScope()
571+
{
572+
var builder = new ContainerBuilder();
573+
builder.RegisterGeneric(typeof(ImplementorA<>)).As(typeof(IDecoratedService<>));
574+
builder.RegisterGenericDecorator(typeof(DecoratorA<>), typeof(IDecoratedService<>));
575+
var container = builder.Build();
576+
577+
var scope = container.BeginLifetimeScope(b => b.RegisterGenericDecorator(typeof(DecoratorA<>), typeof(IDecoratedService<>)));
578+
var scopeInstance = scope.Resolve<IDecoratedService<int>>();
579+
580+
Assert.IsType<DecoratorA<int>>(scopeInstance);
581+
Assert.IsType<DecoratorA<int>>(scopeInstance.Decorated);
582+
Assert.IsType<ImplementorA<int>>(scopeInstance.Decorated.Decorated);
583+
584+
var rootInstance = container.Resolve<IDecoratedService<int>>();
585+
Assert.IsType<DecoratorA<int>>(rootInstance);
586+
Assert.IsType<ImplementorA<int>>(rootInstance.Decorated);
587+
}
588+
553589
[Fact]
554590
public void DecoratorCanBeAppliedToServiceRegisteredInChildLifetimeScope()
555591
{

0 commit comments

Comments
 (0)