1

インフラストラクチャを検証しようとしています。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.Create 2.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.WhereSelectListIterator 2.MoveNext() at System.Linq.Enumerable.WhereSelectEnumerableIterator2 .MoveNext()at System.Linq.Enumerable.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.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.WhereSelectListIterator2.System.Linq.Enumerable.WhereSelectEnumerableIteratorのMoveNext()2.MoveNext() at System.Linq.Enumerable.<DefaultIfEmptyIterator>d__a51.System.Linq.Enumerable.FirstOrDefault [TSource](IEnumerable 1 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.CompositeNodeComposer1.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](IEnumerable1ソース)Ploeh.AutoFixture.Kernel.CompositeSpecimenBuilder.Create(Object request、ISpecimenContext context)at Ploeh.AutoFixture.Kernel.FilteringSpecimenBuilder.Create(Object request、ISpecimenContext context)at 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.WhereSelectListIterator2.MoveNext() System.Linq.Enumerable.WhereSelectEnumerableIteratorで2.MoveNext() at System.Linq.Enumerable.<DefaultIfEmptyIterator>d__a51.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.CompositeNodeComposer1.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

4

1 に答える 1

4

ODataV3にWCFDataServices 5. *を使用していると仮定すると、次のことを試すことができます。

カスタムURIの提供:

他の生成された標本と同様に、その作成を完全に引き継ぐことが可能です。Uri次のように、任意の作成をカスタマイズできます。

public class CustomUriBuilder : ISpecimenBuilder
{
    public object Create(object request, ISpecimenContext context)
    {
        if (request == typeof(Uri))
        {
            return new Uri(
                ConfigurationManager.AppSettings["DataServiceHostAddress"]);
        }

        return new NoSpecimen(request);
    }
}

上記のカスタムタイプを使用すると、aが要求さISpecimenBuilderれるたびに、事前定義された値が返されます。UriUri

フィクスチャインスタンスのカスタマイズ:

これで、テストDataServiceGetsDatabaseVersionを書き直すことができます。

[Fact]
[UseDataService(typeof(DatabaseVersionService))]
public void DataServiceGetsDatabaseVersion()
{
    var fixture = new Fixture();
    fixture.Customize<VersionClientProxy>(c => c.OmitAutoProperties());
    fixture.Customizations.Add(new CustomUriBuilder());
    fixture.Inject(
        new DatabaseVersion
        {
            MajorVersionId = 0,
            MinorVersionId = 0,
            BuildVersionId = 0,
            VersionId = 1
        });

    var sut = fixture.CreateAnonymous<VersionClientProxy>();
    var version = fixture.CreateAnonymous<DatabaseVersion>();
    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));
}

お役に立てば幸いです。

于 2013-02-27T21:24:38.937 に答える