feanz
1/2/2014 - 9:18 AM

AutoMoqDataAttributeVersions Uses Autofixture and Xunit Data Theory attribute.

AutoMoqDataAttributeVersions Uses Autofixture and Xunit Data Theory attribute.

public class AutoMoqDataAttribute : AutoDataAttribute
	{
		public AutoMoqDataAttribute()
			: base(new Fixture()
				.Customize(new AutoMoqCustomization()))
		{
		}
	}
public class AutoMoqControllerDataAttribute : AutoDataAttribute
	{
		public AutoMoqControllerDataAttribute()
			: base(new Fixture()
				.Customize(new AutoMoqControllerCustomization()))
		{
		}
	}

	public class AutoMoqControllerCustomization : CompositeCustomization
	{
		public AutoMoqControllerCustomization()
			: base(new AutoMoqCustomization(),
			new MoqControllerCustomization(),
			new SitecoreCustomization())
		{

		}

		private class MoqControllerCustomization : ICustomization
		{
			public void Customize(IFixture fixture)
			{
				var builder = new MockHttpContextFixture();

				//remove the display attribute to avoid errors testing controller
				fixture.Customize<ControllerContext>(c => c
			   .Without(x => x.DisplayMode)
			   .With(cc => cc.HttpContext, builder.Build()));
			}
		}

		private class SitecoreCustomization : ICustomization
		{
			public void Customize(IFixture fixture)
			{
				fixture.Customizations.Add(new SitecoreItemSpecimenBuilder());
				fixture.Customizations.Add(new SitecoreCustomItemSpecimenBuilder());
				fixture.Customizations.Add(new SitecoreItemIDSpecimenBuilder());
				fixture.Customizations.Add(new SitecoreItemStringIDSpecimenBuilder());
				fixture.Customizations.Add(new SitecoreMediaItemSpecimenBuilder());
				fixture.Customizations.Add(new SitecoreLinkItemSpecimenBuilder());
			}

			private class SitecoreMediaItemSpecimenBuilder : ISpecimenBuilder
			{
				public object Create(object request,
					ISpecimenContext context)
				{
					var pi = request as ParameterInfo;
					if (pi == null)
					{
						return new NoSpecimen(request);
					}
					if (pi.ParameterType != typeof(MediaItem))
					{
						return new NoSpecimen(request);
					}

					return null;
				}
			}

			private class SitecoreLinkItemSpecimenBuilder : ISpecimenBuilder
			{
				public object Create(object request,
					ISpecimenContext context)
				{
					var pi = request as ParameterInfo;
					if (pi == null)
					{
						return new NoSpecimen(request);
					}
					if (pi.ParameterType != typeof(MediaItem))
					{
						return new NoSpecimen(request);
					}

					return null;
				}
			}

			private class SitecoreItemSpecimenBuilder : ISpecimenBuilder
			{
				public object Create(object request,
					ISpecimenContext context)
				{
					var pi = request as ParameterInfo;
					if (pi == null)
					{
						return new NoSpecimen(request);
					}
					if (pi.ParameterType != typeof(Item))
					{
						return new NoSpecimen(request);
					}

					return new Item(new ID(Guid.NewGuid()), 
						new ItemData(new ItemDefinition(new ID(Guid.NewGuid()),
							"itemname",
							new ID(Guid.NewGuid())
							,new ID(Guid.NewGuid())), Language.Current, new Sitecore.Data.Version(1), new FieldList())
							,new Database("master")
						);
				}
			}

			private class SitecoreCustomItemSpecimenBuilder : ISpecimenBuilder
			{
				public object Create(object request,
					ISpecimenContext context)
				{
					var pi = request as ParameterInfo;
					if (pi == null)
					{
						return new NoSpecimen(request);
					}
					if (pi.ParameterType != typeof(CustomItemBase))
					{
						return new NoSpecimen(request);
					}

					return null;
				}
			}

			private class SitecoreItemStringIDSpecimenBuilder : ISpecimenBuilder
			{
				public object Create(object request,
					ISpecimenContext context)
				{
					var pi = request as ParameterInfo;
					if (pi == null)
					{
						return new NoSpecimen(request);
					}
					if (pi.ParameterType != typeof(string)
						|| pi.Name == "id")
					{
						return new NoSpecimen(request);
					}

					return string.Format("{{{0}}}", Guid.NewGuid());
				}
			}

			private class SitecoreItemIDSpecimenBuilder : ISpecimenBuilder
			{
				public object Create(object request,
					ISpecimenContext context)
				{
					var pi = request as ParameterInfo;
					if (pi == null)
					{
						return new NoSpecimen(request);
					}
					if (pi.ParameterType != typeof(ID))
					{
						return new NoSpecimen(request);
					}

					return new ID(Guid.NewGuid());
				}
			}
		}
	}