1

私は次のコードを持っています:

public class FakeOrderRepository:IOrderRepository
{

    private static Fixture fixture = new Fixture();

    private List<acc_ORDERS> dbmock = new List<acc_ORDERS>()
                                          {
                                              fixture.Build<acc_ORDERS>().With(x => x.OrderNumber,Tests.FAKE_ORDERNUMBER)
                                              .Without(x => x.EntityKey)
                                              .Without(x => x.usr_CUSTOMERSReference)
                                              .Without(x => x.usr_CUSTOMERS)
                                              .Without(x => x.sys_COUNTRY1Reference)
                                              .Without(x => x.sys_COUNTRYReference)
                                              .Without(x => x.sys_STATE1Reference)
                                              .Without(x => x.sys_STATEReference)
                                              .Without(x => x.acc_CUSTOMJEWEL_ORDER_ITEMS)
                                              .Without(x => x.acc_DIAMOND_ORDER_ITEMS)
                                              .Without(x => x.acc_JEWELRY_ORDER_ITEMS)
                                              .Without(x => x.acc_CASHFLOW)
                                              .Without(x => x.sys_STATE)
                                              .Without(x => x.sys_STATE1)
                                              .Without(x => x.sys_COUNTRY)
                                              .Without(x => x.sys_COUNTRY1)

                                              .CreateAnonymous()
                                          };



    public int Save(Order orderdto)
    {
        throw new NotImplementedException();
    }

    public Order GetOrderByOrderNumber(int orderNumber)
    {
        try
        {
            var orderdto = dbmock.Where(x => x.OrderNumber == orderNumber).SingleOrDefault();
            orderdto.sys_COUNTRYReference= new EntityReference<sys_COUNTRY>()
                                               {
                                                   Value = new sys_COUNTRY()
                                               };

            var order = Mapper.Map<acc_ORDERS, Order>(orderdto);

            return order;

        }
        catch (Exception ex)
        {

            throw new Exception("when asked to get the order with the ordernumber:" + orderNumber + " an error occured\r\n" + ex.Message);
        }



    }
}

この行のようです:

orderdto.sys_COUNTRYReference= new EntityReference<sys_COUNTRY>()
                                               {
                                                   Value = new sys_COUNTRY()
                                               };

実行すると例外が発生し、参照オブジェクトをモックしようとしています。これを使用せずにコードを呼び出すと、すべて機能しますが、テストコードにはsys_COUNTRYReferenceオブジェクトが必要です。

例外:

このRelatedEndの所有者がnullの場合、要求された操作は許可されません。デフォルトのコンストラクターで作成されたRelatedEndオブジェクトは、シリアル化中のコンテナーとしてのみ使用する必要があります。

この問題を解決する方法、または別の角度から攻撃する方法についてアドバイスしてください。

ありがとうございました。

4

1 に答える 1

0

EntityObject私の経験では、AutoFixtureはEFエンティティではうまく機能しません。その理由は、オブジェクトのすべてのプロパティを割り当てたいためです。はい、で特定のプロパティをスキップするように指示できますが、所有し.Without()ているプロパティの約半分だけを「偽造」したい場合、これは非常に面倒になります。サンプルコードは表面を傷つけているだけで、すでにテストの目的を覆い隠しています。

AutoFixtureが特定の型、特にオープンジェネリック型に割り当てるのを止める方法を見つけることができませんでした。

したがって、これにAutoFixtureを使用できるとは思いません(まだ!-オープンソースであり、誰かが修正を提供する可能性があります...)。

一方、@Ladislavには同意しませんEntityObject。エンティティを使用したテストは正常に機能します。AutoFixtureはこれにかなり無関心に見えますが、それはあなたがテストできないという意味ではありません!AutoFixture以外のものを使用してテスト値を直接割り当てる必要があります。

あなたは確かに次の線に沿って何かをすることができます:

myEntity = new SomeEntity
{
    Foo = fixture.CreateAnonymous<string>(),
    Bar = fixture.CreateAnonymous<int>()
};

..等。

于 2011-09-19T13:17:38.097 に答える