インフラストラクチャを検証しようとしています。AutoFixtureは、コードに循環参照があると言っており、動作を省略すると、標本をオブジェクトタイプにキャストできません。
ソリューションの依存関係をグラフ化しても、循環参照はありません。自動フィクスチャからの出力は、ドメインオブジェクトがドメインオブジェクトを指すパスを私に与えているように見えます。私はそれを理解していません...彼らはかなり明白です。
合格したテストがあるので先に進みますが、不要な循環参照がないことを確認したいと思います。また、この例で単純なドメインオブジェクトを構築していない場合、分離されたコンポーネントに後でAutoFixtureを使用できなくなるのではないかと心配しています。
成功するテストは次のとおりです。
[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);
}
失敗したテストは次のとおりです。
[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));
}
クライアントプロキシは次のとおりです(個別のプロジェクトはデータモデルプロジェクトのみを参照します)。
public class VersionClientProxy : DataServiceContext
{
public VersionClientProxy(Uri serviceRoot)
: base(serviceRoot, DataServiceProtocolVersion.V3)
{
}
public IQueryable<DatabaseVersion> DatabaseVersions
{
get { return CreateQuery<DatabaseVersion>("DatabaseVersions"); }
}
}
これが私がスピンアップしたデータサービスです(サービスは別のプロジェクトにあり、データモデルプロジェクトのみを参照しています)
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 { }
}
}
}
データモデルクラスは次のとおりです(別のプロジェクト、他のすべてのプロジェクトによって参照されます)。
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; }
}
モデルプロジェクトのデータベースバージョンクラスは次のとおりです。
[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; }
}
これが私のデータサービスプロジェクトのDatabaseVersionService.svcファイルです(空のasp.net、コンパイル、iisexpressからのデバッグ、atomまたはjsonは参照可能です):
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;
}
}
throwingrecursionbehaviorを削除し、omitonrecursionbehaviorを追加した後の出力は次のとおりです。
結果メッセージ:System.InvalidCastException:タイプ'Ploeh.AutoFixture.Kernel.OmitSpecimen'のオブジェクトをタイプ'skeletor.Domain.DatabaseVersion'にキャストできません。結果StackTrace:
Ploeh.AutoFixture.Kernel.SpecimenFactoryで1.Create2.Create(Object request, ISpecimenContext context) at Ploeh.AutoFixture.Kernel.NoSpecimenOutputGuard.Create(Object request, ISpecimenContext context) at Ploeh.AutoFixture.Kernel.Postprocessor
(Object request、ISpecimenContext context)atPloeh.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) Ploeh.AutoFixture.Dsl.NodeComposerで1.Create(Object request, ISpecimenContext context) at Ploeh.AutoFixture.Kernel.CompositeSpecimenBuilder.<>c__DisplayClass6.<Create>b__1(ISpecimenBuilder b) at System.Linq.Enumerable.WhereSelectListIterator
2.System.Linq.Enumerable.WhereSelectEnumerableIteratorのMoveNext()2.MoveNext() at System.Linq.Enumerable.<DefaultIfEmptyIterator>d__a5
1.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)atPloeh.AutoFixture.Kernel.SpecimenContextのMoveNext() Ploeh.AutoFixture.Kernel.SpecimenFactoryでResolve(Object request)2.Create(Object request, ISpecimenContext context) at Ploeh.AutoFixture.Kernel.NoSpecimenOutputGuard.Create(Object request, ISpecimenContext context) at Ploeh.AutoFixture.Kernel.Postprocessor
1.Ploeh.AutoFixture.Kernel.CompositeSpecimenBuilder。<> c _DisplayClass6.b_1 (ISpecimenBuilder b)でSystem.Linq.Enumerable2.MoveNext() at System.Linq.Enumerable.WhereSelectEnumerableIterator
でCreate(Object request、ISpecimenContext context)WhereSelectListIterator 2.MoveNext()at System.Linq.Enumerable.d _a51.MoveNext() at System.Linq.Enumerable.FirstOrDefault[TSource](IEnumerable
1ソース)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() System.Linq.Enumerable.WhereSelectEnumerableIteratorで2.MoveNext() at System.Linq.Enumerable.<DefaultIfEmptyIterator>d__a5
1.MoveNext()で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 d:\ projects \ skeletor \ skeletor.AcceptanceTests \ InfrstructureTests.cs:line 31