I'm trying to validate my infrastructure. AutoFixture says I have a circular reference in my code and when I omit the behavior, it cannot cast the specimen to my object type.
Charting the solution dependencies yeilds no circular references. The ouput from autofixture appears to be giving me a path in which a domain object points to a domain object. I don't understand that... they are pretty plain.
I would just move on since I have a test that passes, but I'd really like to make sure I don't have an unwanted circular reference. I'm also concerned I won't be able to use AutoFixture later on for isolated components if it isn't building my simple domain object in this example.
Here is the test that succeeds:
[Fact]
[UseDataService(typeof(DatabaseVersionService))]
public void DataServiceGetsDatabaseVersionNonAutoFixture()
{
var sut = new VersionClientProxy(new Uri(ConfigurationManager.AppSettings["DataServiceHostAddress"]));
var expected = new DatabaseVersion()
{
MajorVersionId = 0,
MinorVersionId = 0,
BuildVersionId = 0,
VersionId = 1
};
var actual = (from a in sut.DatabaseVersions
orderby a.VersionId descending
select a).FirstOrDefault();
Assert.Equal(expected.MajorVersionId, actual.MajorVersionId);
Assert.Equal(expected.MinorVersionId, actual.MinorVersionId);
Assert.Equal(expected.BuildVersionId, actual.BuildVersionId);
Assert.Equal(expected.VersionId, actual.VersionId);
}
Here is the test that fails:
[Fact]
[UseDataService(typeof(DatabaseVersionService))]
public void DataServiceGetsDatabaseVersion()
{
var fixture = new Fixture();
var sut = fixture.Build<VersionClientProxy>().FromFactory<VersionClientProxy>((x) =>
{
return new VersionClientProxy(new Uri(ConfigurationManager.AppSettings["DataServiceHostAddress"]));
}).CreateAnonymous();
var version = fixture.Build<DatabaseVersion>().FromFactory<DatabaseVersion>((x) =>
{
return new DatabaseVersion { MajorVersionId = 0, MinorVersionId = 0, BuildVersionId = 0, VersionId = 1 };
}).CreateAnonymous();
var expected = version.AsSource().OfLikeness<DatabaseVersion>();
var actual = (from a in sut.DatabaseVersions
orderby a.VersionId descending
select a).FirstOrDefault();
Assert.True(expected.Equals(actual));
}
Here is the client proxy (separate project references only data model project):
public class VersionClientProxy : DataServiceContext
{
public VersionClientProxy(Uri serviceRoot)
: base(serviceRoot, DataServiceProtocolVersion.V3)
{
}
public IQueryable<DatabaseVersion> DatabaseVersions
{
get { return CreateQuery<DatabaseVersion>("DatabaseVersions"); }
}
}
Here is the data service I spin up (service is in separate project references only data model project)
public class UseDataServiceAttribute : BeforeAfterTestAttribute
{
private readonly DataServiceHost serviceHost;
public UseDataServiceAttribute(Type serviceToHost)
{
serviceHost = new DataServiceHost(serviceToHost, new Uri[] { new Uri(ConfigurationManager.AppSettings["DataServiceHostAddress"]) });
}
public override void Before(System.Reflection.MethodInfo methodUnderTest)
{
try { serviceHost.Open(); }
catch
{
try { serviceHost.Close(); }
catch
{
try { serviceHost.Abort(); }
catch { }
}
}
base.Before(methodUnderTest);
}
public override void After(System.Reflection.MethodInfo methodUnderTest)
{
base.After(methodUnderTest);
try { serviceHost.Close(); }
catch
{
try { serviceHost.Abort(); }
catch { }
}
}
}
Here is the data model class (separate project, referenced by all other projects):
public class DatabaseVersionDataModel
{
private readonly List<DatabaseVersion> templist;
public DatabaseVersionDataModel()
{
templist = new List<DatabaseVersion> {
new DatabaseVersion() {
MajorVersionId = 0,
MinorVersionId = 0,
BuildVersionId = 0,
VersionId = 1 }
};
DatabaseVersions = templist.AsQueryable();
}
public IQueryable<DatabaseVersion> DatabaseVersions { get; private set; }
}
Here is the database version class also in model project:
[DataServiceKey("VersionId")]
public class DatabaseVersion
{
public int VersionId { get; set; }
public int MajorVersionId { get; set; }
public int MinorVersionId { get; set; }
public int BuildVersionId { get; set; }
}
Here is the DatabaseVersionService.svc file in my data services project (empty asp.net, compiles, debugs out of iisexpress and atom or json is browseable):
public class DatabaseVersionService : DataService<DatabaseVersionDataModel>
{
// This method is called only once to initialize service-wide policies.
public static void InitializeService(DataServiceConfiguration config)
{
// TODO: set rules to indicate which entity sets and service operations are visible, updatable, etc.
// Examples:
// config.SetEntitySetAccessRule("MyEntityset", EntitySetRights.AllRead);
// config.SetServiceOperationAccessRule("MyServiceOperation", ServiceOperationRights.All);
config.SetEntitySetAccessRule("*", EntitySetRights.AllRead);
config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V3;
}
}
Here is the output after removing throwingrecursionbehavior and adding omitonrecursionbehavior:
Result Message: System.InvalidCastException : Unable to cast object of type 'Ploeh.AutoFixture.Kernel.OmitSpecimen' to type 'skeletor.Domain.DatabaseVersion'.
Result StackTrace:
at Ploeh.AutoFixture.Kernel.SpecimenFactory2.Create(Object request, ISpecimenContext context)
at Ploeh.AutoFixture.Kernel.NoSpecimenOutputGuard.Create(Object request, ISpecimenContext context)
at Ploeh.AutoFixture.Kernel.Postprocessor
1.Create(Object request, ISpecimenContext context)
at Ploeh.AutoFixture.Kernel.CompositeSpecimenBuilder.<>c_DisplayClass6.b_1(ISpecimenBuilder b)
at System.Linq.Enumerable.WhereSelectListIterator2.MoveNext()
at System.Linq.Enumerable.WhereSelectEnumerableIterator
2.MoveNext()
at System.Linq.Enumerable.d_a51.MoveNext()
at System.Linq.Enumerable.FirstOrDefault[TSource](IEnumerable
1 source)
at Ploeh.AutoFixture.Kernel.CompositeSpecimenBuilder.Create(Object request, ISpecimenContext context)
at Ploeh.AutoFixture.Kernel.FilteringSpecimenBuilder.Create(Object request, ISpecimenContext context)
at Ploeh.AutoFixture.Dsl.NodeComposer1.Create(Object request, ISpecimenContext context)
at Ploeh.AutoFixture.Kernel.CompositeSpecimenBuilder.<>c__DisplayClass6.<Create>b__1(ISpecimenBuilder b)
at System.Linq.Enumerable.WhereSelectListIterator
2.MoveNext()
at System.Linq.Enumerable.WhereSelectEnumerableIterator2.MoveNext()
at System.Linq.Enumerable.<DefaultIfEmptyIterator>d__a5
1.MoveNext()
at System.Linq.Enumerable.FirstOrDefault[TSource](IEnumerable1 source)
at Ploeh.AutoFixture.Kernel.CompositeSpecimenBuilder.Create(Object request, ISpecimenContext context)
at Ploeh.AutoFixture.Kernel.RecursionGuard.Create(Object request, ISpecimenContext context)
at Ploeh.AutoFixture.Kernel.RecursionGuard.Create(Object request, ISpecimenContext context)
at Ploeh.AutoFixture.Dsl.CompositeNodeComposer
1.Create(Object request, ISpecimenContext context)
at Ploeh.AutoFixture.Kernel.SpecimenContext.Resolve(Object request)
at Ploeh.AutoFixture.Kernel.SpecimenFactory2.Create(Object request, ISpecimenContext context)
at Ploeh.AutoFixture.Kernel.NoSpecimenOutputGuard.Create(Object request, ISpecimenContext context)
at Ploeh.AutoFixture.Kernel.Postprocessor
1.Create(Object request, ISpecimenContext context)
at Ploeh.AutoFixture.Kernel.CompositeSpecimenBuilder.<>c_DisplayClass6.b_1(ISpecimenBuilder b)
at System.Linq.Enumerable.WhereSelectListIterator2.MoveNext()
at System.Linq.Enumerable.WhereSelectEnumerableIterator
2.MoveNext()
at System.Linq.Enumerable.d_a51.MoveNext()
at System.Linq.Enumerable.FirstOrDefault[TSource](IEnumerable
1 source)
at Ploeh.AutoFixture.Kernel.CompositeSpecimenBuilder.Create(Object request, ISpecimenContext context)
at Ploeh.AutoFixture.Kernel.FilteringSpecimenBuilder.Create(Object request, ISpecimenContext context)
at Ploeh.AutoFixture.Dsl.NodeComposer1.Create(Object request, ISpecimenContext context)
at Ploeh.AutoFixture.Kernel.CompositeSpecimenBuilder.<>c__DisplayClass6.<Create>b__1(ISpecimenBuilder b)
at System.Linq.Enumerable.WhereSelectListIterator
2.MoveNext()
at System.Linq.Enumerable.WhereSelectEnumerableIterator2.MoveNext()
at System.Linq.Enumerable.<DefaultIfEmptyIterator>d__a5
1.MoveNext()
at System.Linq.Enumerable.FirstOrDefault[TSource](IEnumerable1 source)
at Ploeh.AutoFixture.Kernel.CompositeSpecimenBuilder.Create(Object request, ISpecimenContext context)
at Ploeh.AutoFixture.Kernel.RecursionGuard.Create(Object request, ISpecimenContext context)
at Ploeh.AutoFixture.Kernel.RecursionGuard.Create(Object request, ISpecimenContext context)
at Ploeh.AutoFixture.Dsl.CompositeNodeComposer
1.Create(Object request, ISpecimenContext context)
at Ploeh.AutoFixture.Kernel.SpecimenContext.Resolve(Object request)
at Ploeh.AutoFixture.SpecimenFactory.CreateAnonymous[T](ISpecimenContext context, T seed)
at Ploeh.AutoFixture.SpecimenFactory.CreateAnonymous[T](ISpecimenContext context)
at Ploeh.AutoFixture.SpecimenFactory.CreateAnonymous[T](ISpecimenBuilderComposer composer)
at Ploeh.AutoFixture.SpecimenFactory.CreateAnonymous[T](IPostprocessComposer`1 composer)
at skeletor.AcceptanceTests.InfrstructureTests.DataServiceGetsDatabaseVersion() in d:\projects\skeletor\skeletor.AcceptanceTests\InfrstructureTests.cs:line 31