Как добавить поддельную ссылку на EF4 с помощью AutoFixture (или без, если возможно) - PullRequest
1 голос
/ 18 сентября 2011

У меня есть следующий код:

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 нулевой. RelatedEnd объекты, созданные по умолчанию Конструктор должен использоваться только как контейнер во время сериализации.

Пожалуйста, дайте совет, как решить эту проблему или атаковать ее под другим углом.

Спасибо.

1 Ответ

0 голосов
/ 19 сентября 2011

AutoFixture не работает с EF EntityObject объектами, по моему опыту. Причина в том, что он хочет присвоить каждому свойству объекта. Да, вы можете указать, чтобы пропустить определенные свойства с помощью .Without(), но это становится довольно утомительным, когда вы хотите "подделать" только половину имеющихся у вас свойств. Ваш пример кода только царапает поверхность и уже затеняет цель теста.

Мне не удалось найти способ запретить AutoFixture когда-либо назначать определенные типы, особенно открытые универсальные типы.

Так что я не думаю, что вы сможете использовать AutoFixture для этого (пока! - это с открытым исходным кодом, и кто-то может внести исправление ...).

С другой стороны, я не согласен с @Ladislav - тестирование с EntityObject объектами работает нормально. Автофиксирование кажется довольно безразличным к этому, но это не значит, что вы не можете проверить! Вам просто нужно назначить тестовые значения с помощью чего-то другого, кроме AutoFixture напрямую.

Вы, конечно, можете сделать что-то вроде:

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

.. и т.п.

...